10.0、C语言——初识指针(2)
指针运算:
1、指针 +- 整数
2、指针 - 指针
3、指针的关系运算
指针 减 指针:
得到的是两者中间减得到中间元素的个数,两个指针相减那么这两个指针一定指向同一块内存空间
不要用两个指向不同内存空间的指针互减(结果不可预知)
下面给大家举个例子:
int my_strlen(char* arr) {
char* start = arr;
char* end = arr;
while (*end != '\0') {
end++;
}
return end - start;
}
int main() {
char arr[] = "strlen";
int My_strlen = my_strlen(arr);
printf("My_strlen = %d",My_strlen);
return 0;
}
自定义一个计算字符串大小的函数 my_strlen(char* arr);
定义两个指针变量一个start 一个 end;
接下来进行 while(*end != '\0') 循环,只要 *end 不等于'\0' 就说明还没有读完整个数组;
等 end 读到最后一个的时候让 end - start 就能得到数组中共有多少元素了
数组从前到后地址一次增大,标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
数组名和指针的关系:
那么除了以下两种情况表示整个数组以外,其他地方出现的数组名均为首元素地址 ->
情况一:
sizeof(arr) 表示计算整个数组的大小
情况二:
&arr 表示取整个数组的地址,虽然打印出来和首元素地址一致,但是当我们 &arr + 1 的时候就会发现地址直接跳过了整个数组的地址,而 &arr[0] + 1 只是跳过一个数组元素的地址
二级指针:
二级指针的定义,代码如下:
int main() {
int a = 10;
int* pa = &a;
int** ppa = &pa;
int*** pppa = &ppa;
return 0;
}
如何去理解好呢?
一级指针中 ->
* 告诉我们 pa 是指针,而 int 告诉我们 pa 所指向的对象类型是 int
同理二级指针中 ->
* 告诉我们 ppa 是指针,而 int* 告诉我们 ppa 所指向的对象类型是 int*
同理三级指针中 ->
* 告诉我们 pppa 是指针,而 int** 告诉我们 pppa 所指向的对象类型是 int**
.............
那二级指针如何使用呢?
int main() {
int a = 10;
int* pa = &a;
int** ppa = &pa;
return 0;
}
如果想要通过二级指针 ppa 找到 变量 a,只需要用 **ppa 解引用符即可
指针数组:
指针数组:存放指针类型数据的数组
声明方式、引用和普通数组方式相似,,代码如下:
int main() {
int a = 10;
int b = 20;
int c = 30;
int* arr[] = {&a,&b,&c};
for (int i = 0;i < 3;i++) {
printf("%p --> %d\n",arr[i],*arr[i]);
}
return 0;
}