C基础问题
C基础问题
高质量里面的
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了。
那下面
void func(struct node *p)
{
struct node *pnode;
pnode = (struct node*)malloc(sizeof(struct node));
pnode-> data = 88;
pnode-> next = NULL;
p=pnode; --- 这里把_p的地址 变掉,那指针参数p,会指向_p吗?
}
[解决办法]
void func(struct node *p) { [color=#FF0000] struct node *_p = p;[/color] struct node *pnode; pnode = (struct node*)malloc(sizeof(struct node)); pnode-> data = 88; pnode-> next = NULL; //p=pnode; --- 这里把_p的地址 变掉,那指针参数p,会指向_p吗? [color=#FF0000] _p = pnode;[/color]}
[解决办法]
要知道 指针也是变量的一种 ,如果要修改参数的值,要么使用指针 *(*p),要么用引用&(*p),有时也可以用函数返回值赋值
[解决办法]
改变的不是指针的值,而是指针所指向的内容。也就是说,指针是一个变量,本身有一个地址,其中存放了其所指向的内容的地址。函数中改变的仅是其中存放的地址。
[解决办法]
形参*p相当于一个局部指针变量,当重新赋值后,就不会指向原先实参传递过来的那块地址;楼主可以写个简单程序验证一下,并打印出来验证一下结果
[解决办法]
其实lz只要时刻关注正在对什么地址进行操作就可以了,明白了这点,其他问题就好解决了。
这里data->buf中的data是副本,也就是说data中的值是完全可靠的。那么通过->这个操作符寻址寻到的buf也就是可靠的。也就是说这里对buf进行的修改也就能够保存到buf中。
lz应该把握核心的规则,不是对于地址的地址这种东西太过执着,c语言的规则万变不离其宗。
[解决办法]