&A [1]应该和A本身是同一地址吗?

时间:2018-10-11 04:21:24

标签: c pointers memory-address

以下代码

//gcc 5.4.0

#include  <stdio.h>
#include  <string.h>
#include  <assert.h>

struct a{
    int a;
};

void change(struct a * a) {
    a->a = 5;
}

int main(void)
{
    struct a * a = malloc(4*sizeof(struct a));
    a[3].a = 2;
    assert(a[3].a == 2);
    change(&a[3]);
    assert(a[3].a == 5);
    printf("Hello, world!\n");
    return 0;
}

change(&a[3]);为什么不将change(&a);change(a);本身的地址作为a [3]的地址本身传递呢?

例如

a =指针

3 =指针的索引3

a [3] =索引3的结构

&a [3] =结构的地址> a的地址,按照结构a * a,指向结构a的点,并且a [3]是从a指向第3个结构的指针,该结构是其父级第三种结构本身就是一个

2 个答案:

答案 0 :(得分:2)

您的代码中有许多a

  1. 一种结构a
  2. 此结构的元素,它是整数a
  3. 指向main中此结构a的指针。指针的名称也是a

这确实不是解决问题的好方法,但这是每一行的说明。

struct a * a = malloc(4*sizeof(struct a));  // Allocate memory to a (no 3) (pointer) of 4 structures . (i.e. 4 structures)
a[3].a = 2;                  //the third structure's element (a) has value 2.
assert(a[3].a == 2);         // Check
change(&a[3]);               // Pass the address of a[3] (third element of structure array to function
                            // Function will change the element a of a[3] to 5
assert(a[3].a == 5);        // verify that a[3].a == 5 
printf("Hello, world!\n");
return 0;

答案 1 :(得分:0)

您应该按照@Rishikesh的建议使用良好的编程习惯,并在Wkipedia中查看此article

但是,无论如何,正如@aschelper所说,&a[3]是数组第四个元素的地址。

之所以这样,是因为precedence of the operators[]运算符比&运算符具有更高的优先级,因此C首先获取数组的第四个元素(索引3),然后返回其地址。