我有以下代码:
#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;
}
输出:
b is on 0xbfa966d4
a is on 0xbfa966d4
magic is -1079417052
这里我将a
作为指向数组b
的数组10的指针,所以为什么我无法获得32的值a[2]
?
a[2]
被评估为*(a+2)
所以现在有一个数组b
的地址,所以*(b+2)
和*(a+2)
相似,所以为什么我没有得到价值32这里吗?
修改: 我用
得到了答案(*a)[2]
但我不知道它是如何运作的...... 看到 什么时候
a[2]
为*(a+2)
,a+2
为加号2 * sizeof(int[10])
字节。
这种方式(*a)[2]
如何扩展?
答案 0 :(得分:7)
由于a
已经是指针,因此必须取消引用它才能引用它指向的数组:
(*a)[2]
答案 1 :(得分:5)
根据指针算法规则,a[2]
为*(a+2)
,a+2
为a
加2 * sizeof(int[10])
字节。
(想想普通的int *p
; p+1
是p
加sizeof(int)
个字节而(char *)(p + 1)
与(char *)p + 1
不同。现在替换{ {1}}与int
)
答案 2 :(得分:1)
#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
你看到发生了什么事吗? magic
减去a
等于80
,即4 * 10 * 2。
这是因为a
是指向十个整数数组的指针,因此sizeof(*a) == 10 * sizeof(int)
而不是sizeof(a) == sizeof(int)
,这正是您所期望的。
下次注意指针算术中的类型!
答案 3 :(得分:0)
我无法在此处添加评论,因为它需要50个声望。所以这里是我发布问题的问题。 很抱歉,如果我在答案框中发布问题会违反某些规则。 这个问题表明我们在执行指针运算时应该小心。但是如果只使用指向整数的指针就可以完成同样的事情,那么使用指向数组的指针有什么用呢?
答案 4 :(得分:-1)
int b [10] == int*
指向数组中的第一个值
int(* a)[10] == int**
指向指向数组的指针的地址
a+2 == (&b)+2
希望这能为你解决问题