数组指针访问数组中的元素
void fun_1(){int a = {1,2,3,4,5};
int *temp = a;
for(int i = 0; i< 5; i++){
printf("%d ",*temp++);
}
printf("\n");
//运行结果:1 2 3 4 5
//疑问一:为何该种方式可以取出数组中的内容,下面fun_2中利用数组指针反而取不出来?
}
void fun_2(){
int a = {1,2,3,4,5};
int (*p) = a;//
printf("addr of a:%p\n",p);//0060Fe4a
for(int i = 0; i < 5;i++){
printf("%d",*p++);
}
printf("\n");
//运行结果:63566606356680 6356700 6356720 6356740
//疑问二:上述方法为何没有真确取出数组中的内容
for(int i = 0; i< 5; i++){
printf("%d",*(*p++));
//数组指针是二级指针? *p 获取数组元素的地址,*(*p)获取该地址中的元素内容
}
printf("\n");
//运行结果:-21966436733006356956
for(int i = 0; i<5;i++){
printf("%d",*(*(p + i) ));
}
printf("\n");
//运行结果: 635696420095493354199040
int (*p1) = &a;
for(int i = 0 ; i<5;i++){
printf("%d ", *p1++);
}
printf("\n");
//运行结果:1,2,3,4,5
for(int i = 0; i<5;i++){
printf("%d ",*(*p1 + i ));
}
printf("\n");
//运行结果:-1 6356820 1966458992 1682321915 -2
// 小甲鱼老师这样运行是对的,为何我这里运行不出来:运行环境为windows下的codeBlock
}
你fun2定义的是一个指向一维数组的指针,别用*p++输出,用(*p)。关于指针的指针,你代码写的有点乱,我也初学看的不太懂。还有a是数组名,其实就是一个指向第一个元素的指针,不必用取地址运算符&。 因为你的程序中数组指针p或者p1都进行过多次自加,早就不是你最开始指向的数组a的地址了。只有最后一种写法是对的。前面几种都不对。之所以没出结果,就是因为p1已经在前面被p1++修改了。
关于数组指针,可以看看下面的帖子
我回答过的帖子 你这代码看得我头痛 ,只瞄了一下第一个疑问,回答一下吧,
int (*p) = a;//
你这个代码是数组指针,是数据类型为int【5】的一个数组指针,而且你这句代码有问题,应该是 int (*p) = &a;这样才对,a的步长是一个元素,&a的步长是一个数组,你想想你指针p是一个int【5】类型,是属于数组类型,赋值为a,a是一个元素是int类型,当然对于指针来说都是地址,这么做也可以。
for(int i = 0; i < 5;i++){
printf("%d",*p++);
}
你这句代码问题更大,第一个:for循环已经i++了, 你p还搞搞一次++
第二个:p指的是数组类型,你要取值不能用p++,应该用 (*p)
附一个代码:
void fun_2(){
int a = {1,2,3,4,5};
int (*p);
p = &a;
for(int i = 0; i < 5;i++){
printf("%d ",(*p));
}
printf("\n");
}
页:
[1]