我是C和指针的新手。以下是我正在尝试的一些代码。
struct node{
struct node * next;
struct node * prev;
int num;
};
void func(struct node * leaf , struct node ** add_leaf){
printf("function starts");
printf("&leaf = %p add_leaf = %p\n" , &leaf , add_leaf);
printf("leaf = %p *add_leaf = %p\n" , leaf , *add_leaf);
printf("function over");
return
}
void main(){
struct node * leaf = (struct node*)malloc(sizeof(struct node));
printf("leaf = %p\t&leaf = %p\n" , leaf , &leaf);
func(leaf , &leaf);
}
leaf和* add_leaf的值相等,这正是我的预期。但是我做不到 理解为什么在函数内部打印时& leaf和add_leaf的值存在差异。在这里,我试图打印节点指针叶的地址。
答案 0 :(得分:3)
调用leaf
时,会复制main
中的局部变量func
。这意味着leaf
内的局部变量func
与leaf
内的main
具有相同的值,即它指向相同的内存地址(因此第二次检查的等效性) ,但它本身存储在不同的地址。
答案 1 :(得分:2)
如果你画一个带箭头和方框的图片,我通常会发现更容易理解指针。
& leaf 为您提供变量 leaf 的地址,因为您有两个名为 leaf 的不同变量(两者都包含指向你的malloc分配的结构),你得到两个不同的地址:
答案 2 :(得分:0)
leaf
是指向struct node
的指针,指针是存储在内存中的32位(取决于架构)整数。
当您将leaf
传递给printf
时,会发生什么,leaf
变量的副本将在堆栈上进行。该副本对应于printf
函数的第二个本地参数。
但是当您将&leaf
传递给printf
函数时,您所做的就是传递leaf
变量的地址。
由于leaf
中的main()
变量和printf
的第二个参数位于两个不同的位置,因此它确实会打印两个内存地址。