2017-05-04 218 views
1
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

+2

嗯......两者都在这里传递指针(“引用”)。你可以改变它们指向的东西('int'或'struct'),但是用双指针,你不能改变它们指向的地方。所以你的第二个问题是无意义的。你的第一个问题基本上误解了' - >'的用途,即在一个运算符中取消引用和查找属性。你总是可以做'(* head).data = 6;'如果你想看到'*'进行解引用。 – ShadowRanger

+0

@ShadowRanger你的意思是 - *但是用双指针,你可以**改变他们指向的位置*? –

+0

@AjayBrahmakshatriya:哎呀。很确定我的意思是键入*,但**没有**双指针... *。同样的想法。 – ShadowRanger

回答

6

为什么我们不能使用*head -> data = 6

因为->是引用操作是取代星号*。您可以用星号改写,也

(*head).data = 6 

你需要括号,因为dot has higher precedence than indirection。运营商->已被引入,以便在指向struct的指针的情况下使间接更易读。

为什么通过someMethod(pa)通过引用传递和someMethod(head)是传值?

它都是按值传递的,因为指针也是按值传递的。传递指针可以引用原始变量并对其进行修改,但指针本身已被复制。

1

第一个问题的答案,你已经得到了。
对于第二个问题,考虑三个变量,A,B,C,其中A & C是整数变量,B是整数指针。图片中显示了变量名称,它们的值和地址(假设看到一个内存映射) 。 See variables, their names, values and address

看到这个代码

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())本身。
我希望,这清除了怀疑。

+0

我非常感谢你的努力! –