我尝试使用指针到达数组成员。 Array的第一个成员地址是23fe20; 当我写' 1'该程序必须显示23fe24(因为23fe20 + 4 * 1 = 23fe24),但不是这样工作。程序输出为:23fe30 .. 我可以使用*(指针+ i)来接触阵列成员,但我想要与地址联系。我怎样才能做到这一点?对不起我的英文,非常感谢:'(
int main(int argc, char *argv[]) {
int array[5]={46,85,111,1976,2};
int *pointer,indices;
pointer=array;
int i=0;
printf("Array members : ");
for(i=0;i<=4;i++){
printf("%d ",array[i]);
}
printf("\n\n Array's First member' : %x\n\n",&*pointer);
printf("Which array member do you want to reach? ");
scanf("%d",&indices);
printf("\n Your member adress : %x",pointer+sizeof(int)*indices);
return 0; }
答案 0 :(得分:2)
您使用sizeof(int)
计算的地址已由编译器为您完成。因此,您的计算使其指向其他地方(因为相同的计算已完成两次)。您只需向指针添加一个整数类型即可访问元素。
所以:
printf("\n Your member adress : %p",(void*) (pointer+indices));
您还应该在打印地址的其他地方使用%p
。
答案 1 :(得分:2)
您看到的行为的原因是,在C中,指针具有类型,并且定义了添加以添加许多成员,而不是 bytes 。
实际上,语法array[i]
与*(array+i)
相同。
因此,您必须删除乘法sizeof(int)
,或者,如果您真的想要探索地址上的算术,请pointer
char *
相反,因为一个字符是一个字节。
示例:
char *cp;
int *ip;
ip = array;
cp = (char *) ip;
printf("%p\n%p\n", ip + 1, cp + 1);
假设array
位于地址23fe20:,将打印
23fe24
23fe21
(假设sizeof(int) == 4
)