C - 传递结构指针VS整数指针指向函数

时间:2017-05-04 03:51:00

标签: c pointers data-structures struct linked-list

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

2 个答案:

答案 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是整数指针。变量名,它们的值和地址(假设看到一个内存映射)  已在图片中显示。 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是指针,所以我们传递b的值,即(1000)的地址。 因此,如果我们修改函数fun()中的b,则该更改将仅反映在fun()内 现在我们调用函数fun1()

 fun1(&b,&c)

这里,我们传递的是b的地址(即3000)。所以,当我们修改fun1()中的b时,我们也会在main()中看到反射。

因此,按值传递意味着,我们希望使用值而不修改调用函数(main())中存在的原始指针。但是当我们需要在我们的调用函数(main())本身中反映的任何重大更改时,我们通过引用传递。
 我希望,这清除了疑点。