以下代码
//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个结构的指针,该结构是其父级第三种结构本身就是一个
答案 0 :(得分:2)
您的代码中有许多a
。
a
a
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),然后返回其地址。