如何使用“指向数组10的int”?

时间:2012-02-16 09:34:21

标签: 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\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]如何扩展?

5 个答案:

答案 0 :(得分:7)

由于a已经是指针,因此必须取消引用它才能引用它指向的数组:

(*a)[2]

答案 1 :(得分:5)

根据指针算法规则,a[2]*(a+2)a+2a2 * sizeof(int[10])字节。

(想想普通的int *p; p+1psizeof(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

希望这能为你解决问题