指针不以所需方式打印

时间:2015-07-22 05:55:59

标签: c pointers

这是一个C代码

int (*a)[3];                                                        

a是指向3个整数数组的指针

a=(int (*)[3])malloc(sizeof(int)*3);                                

注意这里使用的Typecast;必须在显示的类型转换中指定元素数量。此外,*周围的括号是必要的。

printf("brrbrrbrr  %d  %d  %d %d\n",&a,a,a+1,a+2);

*(a+0)[0]=40;
*(a+0)[1]=41;
*(a+0)[2]=42;
printf("noobnoob  %d %d %d \n",a[0][0],*(a+0)[1],(*(*(a+0)+2)));

输出结果为:

brrbrrbrr  -7077000  29278656  29278668 29278680
noobnoob  40 41 0 

我不明白为什么最后一个数字是0而不是42?

2 个答案:

答案 0 :(得分:1)

索引的优先级高于取消引用指针的优先级。你的作业没有做你想要的。它们的评估如下:

*((a+0)[0])=40;
*((a+0)[1])=41;
*((a+0)[2])=42;

如果你想保留你的语法,你应该使用括号,如:

(*(a+0))[0] = 40;
(*(a+0))[1] = 41;
(*(a+0))[2] = 42;

这同样适用于打印数组的第二个元素。 *(a+0)[1]应为(*(a+0))[1]

答案 1 :(得分:0)

您正在寻找的是

int (*a)[3] = malloc(sizeof(int) *3);

(*a)[0] = 40;
(*a)[1] = 41;
(*a)[2] = 42;


printf("%d %d %d\n",(*a)[0],(*a)[1],(*a)[2]);

a是指向3个int成员数组的指针。因此,为指针分配内存并存储值,如上所示。

如果您想要存储值的地址,那么您应该

printf("%p\n",(void*)(a)[0]);