指针
数组元素的指针
案例1:通过数组元素指针遍历数组的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<stdio.h> int main(int argc,char *argv[]){ int arr[5] = {10,20,30,40,50}; int n = sizeof(arr) / sizeof(arr[0]); int i = 0; int *p = &arr[0];
for(i = 0; i < n; i++){ printf("arr[i]=%d ",*(p+i)); } printf("\n");
return 0; }
|
运行结果:
案例2:通过数组元素指针获取键盘输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include<stdio.h> int main(int argc,char *argv[]){ int arr[5] = {10,20,30,40,50}; int n = sizeof(arr) / sizeof(arr[0]); int i = 0; int *p = &arr[0];
for(i = 0; i < n; i++){ scanf("%d",p+i); }
for(i = 0; i < n; i++){ printf("arr[i]=%d ",*(p+i)); } printf("\n");
return 0; }
|
运行结果:
案例3:问,输出的是多少?
1 2 3 4 5 6 7 8 9
| #include<stdio.h> int main(int argc,char *argv[]){ int arr[5] = {10,20,30,40,50}; int *p = &arr[2]; p++; printf("%d",*(p+1));
return 0; }
|
运行结果:
数组的 [] 和 *() 的关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<stdio.h> int main(int argc,char *argv[]){ int arr[5] = {10,20,30,40,50}; int *p = NULL;
p = &arr[0];
printf("%d\n",arr[1]); printf("%d\n",*(arr + 1));
printf("-----------------------------");
printf("%d\n",*(1 + arr)); printf("%d\n",1[arr]);
return 0; }
|
运行结果:
为啥 arr代表的是 数组第0个元素的地址
由上面的结论可得:
1 2 3 4
| &arr[0] = & *(arr+0) = arr+0 = arr;
|
总结:
- [] 是*() 的缩写
- 数组名arr代表的是数组 首元素的地址(第0个元素的地址)
arr 和 &arr 的区别(了解)
arr:数组的首元素地址
&arr:数组的首地址(数组名取地址没啥意义的,这个只是一个表达式的结合)
案例:
1 2 3 4 5 6 7 8 9 10 11 12
| #include<stdio.h> int main(int argc,char *argv[]){ int arr[5] = {10,20,30,40,50}; printf("arr=%u\n",arr); printf("arr+1=%u\n",arr+1); printf("------------------------\n"); printf("&arr=%u\n",&arr); printf("&arr+1=%u\n",&arr+1);
return 0; }
|
运行结果:
分析:
arr+1增加了4字节,跳过1个元素
&arr+1增加了20字节,跳过5个元素即整个数组
结论:
- arr代表的是数组首元素的地址,+1跳过一个元素
- &arr代表的是数组的首地址,+1跳过整个数组
- arr和&arr在地址编号上是一样的,但是类型是完全不一样的
注意:数组名 arr
是个符号常量,不能被修改(赋值) arr++ (错误)
指向同一个数组的两个元素的指针变量间的关系
案例1:问,p2-p1=?12还是3?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<stdio.h> int main(int argc,char *argv){ int arr[5] = {10,20,30,40,50}; int *p1 = arr; int *p2 = arr+3;
printf("%d",p2-p1);
if(p2>p1){ printf("p2>p1"); }else{ printf("p2<=p1"); }
p1=p2;
p1+p2;
printf("%d\n",p2[-2]); return 0; }
|
案例2:
#include<stdio.h>
int main(int argc,char *argv){
int arr[5] = {10,20,30,40,50};
int *p = arr;
printf("%d\n",*p++);
printf("%d\n",(*p)++);
printf("%d\n",*(p++));
return 0;
}
讲解: