void main(){
int a = 100;
int* pa = &a;
*pa = 999;
}
上面的代码会将a的值设为999.但为什么结构指针的处理方式不一样呢?
struct node* head = (struct node*) malloc(sizeof(struct node));
head -> data = 6;
head -> next = NULL;
为什么我们不能使用*head -> data = 6
?为什么传递someMethod(pa)
是通过引用传递而someMethod(head)
是按值传递的? reference
答案 0 :(得分:6)
为什么我们不能使用
*head -> data = 6
?
因为->
是取消引用运算符,替换星号*
。你也可以用星号重写
(*head).data = 6
您需要括号,因为dot has higher precedence than indirection。已经引入了运算符->
,以便在指向struct
的情况下使间接更具可读性。
为什么传递
someMethod(pa)
是通过引用传递的,someMethod(head)
是按值传递的?
这一切都是通过值传递的,因为指针也是按值传递的。传递指针可以引用原始变量并对其进行修改,但指针本身也会被复制。
答案 1 :(得分:1)
第一个问题的答案,你已经有了。
对于第二个问题,考虑三个变量,A,B,C,其中A& C是整数变量,B是整数指针。变量名,它们的值和地址(假设看到一个内存映射)
已在图片中显示。
请参阅此代码
void fun(int *b,int *c)
{
printf("\nfun %d",*b);
b=c;
}
void fun1(int **b, int *c)
{
printf("\nfun1 %d",**b);
*b=c;
}
int main()
{
int a=10;
int c=200;
int *b=&a;
printf("\n %d %d %d",a,*b,c);
fun(b,&c);
printf("\n %d %d %d",a,*b,c);
fun1(&b,&c);
printf("\n %d %d %d",a,*b,c);
return 0;
}
在main()
,& c是局部整数变量,具有不同的数据,b是整数指针。我们这样调用函数fun()
,
fun(b,&c);
因为,b是指针,所以我们传递b的值,即(1000)的地址。
因此,如果我们修改函数fun()
中的b,则该更改将仅反映在fun()
内
现在我们调用函数fun1()
,
fun1(&b,&c)
这里,我们传递的是b的地址(即3000)。所以,当我们修改fun1()
中的b时,我们也会在main()
中看到反射。
因此,按值传递意味着,我们希望使用值而不修改调用函数(main()
)中存在的原始指针。但是当我们需要在我们的调用函数(main()
)本身中反映的任何重大更改时,我们通过引用传递。
我希望,这清除了疑点。