C - 传递结构指针VS函数的整数指针
void main(){
int a = 100;
int* pa = &a;
*pa = 999;
}
上面的代码会使a的值为999.但是为什么不用相同的方式处理结构的指针呢?C - 传递结构指针VS函数的整数指针
struct node* head = (struct node*) malloc(sizeof(struct node));
head -> data = 6;
head -> next = NULL;
为什么我们不能使用*head -> data = 6
?为什么通过someMethod(pa)
是通过引用和someMethod(head)
是传递值? reference
为什么我们不能使用
*head -> data = 6
?
因为->
是引用操作是取代星号*
。您可以用星号改写,也
(*head).data = 6
你需要括号,因为dot has higher precedence than indirection。运营商->
已被引入,以便在指向struct
的指针的情况下使间接更易读。
为什么通过
someMethod(pa)
通过引用传递和someMethod(head)
是传值?
它都是按值传递的,因为指针也是按值传递的。传递指针可以引用原始变量并对其进行修改,但指针本身已被复制。
第一个问题的答案,你已经得到了。
对于第二个问题,考虑三个变量,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是一个指针的话,我们是传递的(1000)b即地址的值。 因此,如果我们修改函数fun()
中的b,则该更改将仅反映在fun()
的内部。
现在我们调用函数fun1()
,
fun1(&b,&c)
在这里,我们传递b即(3000)的地址。所以,当我们修改fun1()
中的b时,我们也会在main()
中看到反射。
所以,按值传递意味着,我们希望使用值而不修改存在于调用函数(main()
)中的原始指针。但我们通过参考,当我们需要任何重大变化,应该反映在我们的调用函数(main()
)本身。
我希望,这清除了怀疑。
我非常感谢你的努力! –
嗯......两者都在这里传递指针(“引用”)。你可以改变它们指向的东西('int'或'struct'),但是用双指针,你不能改变它们指向的地方。所以你的第二个问题是无意义的。你的第一个问题基本上误解了' - >'的用途,即在一个运算符中取消引用和查找属性。你总是可以做'(* head).data = 6;'如果你想看到'*'进行解引用。 – ShadowRanger
@ShadowRanger你的意思是 - *但是用双指针,你可以**改变他们指向的位置*? –
@AjayBrahmakshatriya:哎呀。很确定我的意思是键入*,但**没有**双指针... *。同样的想法。 – ShadowRanger