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