C 如何使用;指向int";的数组10的指针;?
我有以下代码:C 如何使用;指向int";的数组10的指针;?,c,C,我有以下代码: #include<stdio.h> int main() { int(* a)[10]; //declare a as pointer to array 10 of int int b[10]; // taken a array of 10 int b[2]=32; a=&b; printf("b is on %p\n",&b); printf("a is on %p\
#include<stdio.h>
int main()
{
int(* a)[10]; //declare a as pointer to array 10 of int
int b[10]; // taken a array of 10 int
b[2]=32;
a=&b;
printf("b is on %p\n",&b);
printf("a is on %p\n",a);
printf("magic is %d\n",a[2]); // why this is not showing 32
return 0;
}
这里我将a
作为int数组10的指针,它指向数组b
,那么现在为什么我无法在a[2]
上获得32的值呢
a[2]
被评估为*(a+2)
所以现在a有数组的地址b
所以*(b+2)
和*(a+2)
是相似的,为什么我这里没有得到值32
编辑: 我通过使用
(*a)[2]
但我不明白它是怎么工作的。。。
看见
什么时候
a[2]
是*(a+2)
而a+2
是一个加号2*sizeof(int[10])
字节
这样
(*a)[2]
如何展开?由于a
已经是一个指针,您必须取消对它的引用以引用它所指向的数组:
(*a)[2]
根据指针算术规则,
a[2]
是*(a+2)
,a+2
是a
加2*sizeof(int[10])
字节
(想象一个普通的
int*p
;p+1
是p
加sizeof(int)
字节和(char*)(p+1)
不同于(char*)p+1
。现在将int
替换为int[10]
)intb[10]=int*/code>,它指向数组中的第一个值
int(*a)[10]=int**
指向指向数组的指针的地址
a+2==(&b)+2
希望这能帮你解决问题
#include<stdio.h>
int main()
{
int(* a)[10]; //declare a as pointer to array 10 of int
int b[10]; // taken a arry of 10 int
b[2]=32;
a=&b;
printf("b is on %p\n",&b);
printf("a is on %p\n",a);
printf("magic is %p\n",a + 2); // Changed to show pointer arithmetic
return 0;
}
你看到发生什么事了吗magic
减去a
等于80
,即4*10*2。
这是因为a
是一个指向十个整数数组的指针,所以sizeof(*a)==10*sizeof(int)
而不是sizeof(a)==sizeof(int)
,这正是您所期望的。
下次注意指针算术中的类型 我无法在这里添加评论,因为它需要50%的声誉。我的问题就在这里。
对不起,如果我将问题张贴在回答框中,将违反某些规则。
这个问题表明我们在执行指针运算时应该小心。但是,如果仅仅使用指向整数的指针就可以完成同样的事情,那么使用指向数组的指针有什么好处呢?这是错误的b
不是int*
,a
不是int**
,int*a[10]
不同于int(*a)[10]
@interjay是的,我第一次写它的方式会产生一个10 int*的数组。但是b
是int*
不,b
不是int*
,但在某些(不是全部)上下文中它可以衰减为int*
。但是,a
永远不会衰减为int**
,因为它们的行为完全不同。你关于a
指向指针地址的那一行也是错误的。@interjay好吧,从问题的上下文中去掉它是错误的,但在他的例子中是正确的。下一步,我将尝试更笼统地回答这个问题time@Eregrith:我认为这将违反严格的别名规则,并导致未定义的行为。当a[2]是*(a+2),a+2是+2*sizeof(int[10])时,这样(*a)[2]将如何展开?*a
是int[10]
,更具体地说是b
,因此,这将获取b
中的第三个元素。它将成为*((*a)+2)
,也就是说*(b+2)
因此b[2]
@Eregrith:不,它将正常工作。您的推理假设a
是int*
,您的最后一句话毫无意义。这称为“单行替换”:(*a)[2]将与[0][2]相同
#include<stdio.h>
int main()
{
int(* a)[10]; //declare a as pointer to array 10 of int
int b[10]; // taken a arry of 10 int
b[2]=32;
a=&b;
printf("b is on %p\n",&b);
printf("a is on %p\n",a);
printf("magic is %p\n",a + 2); // Changed to show pointer arithmetic
return 0;
}
b is on 0xbfe67114
a is on 0xbfe67114
magic is 0xbfe67164