数组指针问题求教,谢谢!
#include <stdio.h>int main(void)
{
int temp = {1,2,3,4,5};
int (*p2) = &temp;
int i;
for(i=0;i<5;i++)
{
printf("%d\n",*(*p2+i);//如果*p2表示数组temp的地址,那么要打印下一个元素为什么只是给地址加1?整形变量不应该占4个字节吗,地址为什么不加4?
}
return 0;
} 本帖最后由 jackz007 于 2019-4-30 11:46 编辑
int (*p2) 定义 p2 是指向末维是 5 的二维整型数组的指针,这就意味着,如果 p2 ++ 就会直接跨过 5 个整型元素, int 型数值占用 4 个字节,那么,跨度就是 5 x 4 = 20 个字节,就是说,p2 的数值将会增加 20,而不是 1 也不是 5。
明白了这个道理再看你的代码就好理解了
p2 = & temp
* p2 = temp = & temp
* p2 + i = & temp
*(* p2 + i) = temp 地址加1不是加一个字节,加的是其对应变量的字节数 int (*p2) = &temp;
第一个问题:
p2表示数组temp的地址(&temp),p2的类型是 int(*);
*p2表示的是数组首个元素的地址(*(&temp) = temp),*p2的类型是 int *;
*p2+i 可以看成是 temp+i , *(*p2+i)也就可以看成*(temp+i),这个我记得小甲鱼的课程里面有讲,就是temp;
所以打印的时候,i++就可以了,和你平时打印数组一样。
第二个问题:
*p2+i 里面的*p2是 int * 类型;
i,单位是 int * 的步长(4Byte);
举个不是很恰当的例子,假如1分钟有4秒,1小时有5分钟;其中p2就是时针,*p2就是分针,1Byte就是秒的刻度;
其中*p2走一格(*p2+1),就是1分钟,4秒(4Byte);而不是1秒(1Byte);
其中p2 走一格(p2+1),就是1小时,20秒(5*4Byte);
这里*P2+1,本来就是针对int*加一个步长(4Byte),所以不用加4。
仔细看一下上面大佬列的那些代码,都打印出来看看就会明白了。
只需要记着指针+1,不是只加一个字节!取决于对应指针的类型,在64位编译器的环境下:
char *p p+1代表p加1个字节
int *p p+1代表p加4个字节
float *p p+1代表p加4个字节
double *p p+1代表p加8个字节
。。。
没有什么好理解不好理解的,就是这么规定的!
可以参考以下程序加以验证!
#include <stdio.h>
int main()
{
char *s="abcd";
printf("%p\n",s);
printf("%p\n",s+1);
printf(".........\n");
int *temp="abcd";
printf("%p\n",temp);
printf("%p\n",temp+1);
return 0;
}
//输出结果
// 0x400634
// 0x400635
// .........
// 0x400634
// 0x400638
指针的值+1并不是真实地址加1 如果是int型那么就+4字节 以此类推
其实编译器会自动的帮你选择一个合适的偏移值加在指针上(根据指针类型)
如果用64位系统 那么int型是4Byte 32位是2Byte 难道程序员还要考虑运行环境的问题吗 这些都由编译器来决定
还有 如果就像你说的那样 指针就不需要规定类型了 其实指针规定类型也是因为不同类型所偏移的空间不同
其实上面已经有人回答的很清楚了{:10_256:}
页:
[1]