指针运算
指针+-整数
指针+-整数有一个常见的作用:用指针打印数组的内容
int main()
{
int arr[10];
int* p = arr;
for (int i = 0; i < 10; i++)
{
arr[i] = i;
}
for (size_t i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
这里我们可以探索到许多方法,因为数组名是首元素的地址,所以*(p + i ) = *(arr + i) = arr[i] = p[i]
指针-指针
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
{
p++;
}
return p - s;
}
int main()
{
char arr[] = "hello bit";
int ret = my_strlen(arr);
printf("%d", ret);
}
指针-指针我们可以模拟实现strlen函数,这个函数是用来求字符串长度的,可以看到结果是正确的。
前提:这两个指针指向的是同一个区域,而且类型相同,得到差值的绝对值是他们之间的元素个数
指针的关系运算
指针和指针之间是可以比较的,当然也必须是同一个区域而且类型相同
注意:C语言标准规定:允许数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针比较
P2 可以和 P3 比但是不可以和 P1 比,这就是规定,我们也不知道为什么。
指针和数组
我们之前就说过指针和数组名的关系,直接说结果:
数组名就是数组首元素的地址(1.但是两种情况除外,之前文章说过 这里 2.数组名是一个常量地址,不可以++)
二级指针
指针变量也是变量,是变量就会有地址,那指针变量的地址存放到哪里?
这就是二级指针,用来存放指针变量的地址。
int main()
{
int n = 10;
int* p = &n;
int** pp = &p;
}
可以看到指针变量p 的指针放到了二级指针变量pp里,理论上pp还有地址,但是一般我们只使用到二级指针就行了。
指针数组
指针数组是一个指针还是数组?
答案是数组,是一个存放指针的数组。
我们知道字符数组,整形数组:
char arr[5];
int arr1[5];
指针数组:
int* arr3[5];
这就是一个整形指针数组,里面都是整形指针。
知道指针数组后,我们就可以模拟一个二维数组。(但是模拟的二维数组中元素的内存没什么联系,真正的二维数组元素内存是连续存放的)
想要模拟一个二维数组,只需要指针数组中都是一些数组的指针就行:
int arr[5];
int arr1[5];
int* p = arr;
int* p1 = arr1;
int* arr3[] = {p,p1};
arr3[]遍历就可以模拟一个二维数组了。
int main()
{
int arr[5] = { 1,23,4,5,5 };
int arr1[5] = {32,44,55,33,55};
int* arr3[] = { arr,arr1 };
printf("%d", arr3[0][0]);
}