【问题标题】:C - Pass structure pointer VS integer pointer to functionsC - 将结构指针 VS 整数指针传递给函数
【发布时间】:2017-10-02 02:00:30
【问题描述】:
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

【问题讨论】:

  • 嗯...两者都在此处传递指针(“引用”)。您可以更改它们指向的内容(intstruct),但使用双指针,您无法更改它们指向的位置。所以你的第二个问题是荒谬的。您的第一个问题基本上误解了-> 的目的,即取消引用和查找单个运算符中的属性。如果您想查看 * 进行取消引用,您可以随时使用 (*head).data = 6;
  • @ShadowRanger 你的意思是——但是使用双指针,你可以改变它们指向的位置
  • @AjayBrahmakshatriya:哎呀。很确定我的意思是输入没有双指针...。同样的想法。

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


【解决方案1】:

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

因为-> 是一个替换星号* 的解引用运算符。你也可以用星号重写

(*head).data = 6

您需要括号,因为dot has higher precedence than indirection。引入了运算符 -> 以在指向 structs 的指针的情况下使间接更具可读性。

为什么传递someMethod(pa) 是按引用传递而someMethod(head) 是按值传递?

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

【讨论】:

    【解决方案2】:

    第一个问题的答案,你已经得到了。
    对于第二个问题,考虑三个变量 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()中,a & c 是局部整数变量,有不同的数据,b 是整数指针。我们像这样调用函数fun()

     fun(b,&c);
    

    由于 b 是一个指针,所以我们传递 b 的值,即 a (1000) 的地址。 因此,如果我们修改 b 内部函数 fun(),该更改将仅反映在 fun() 内部。
    现在我们调用函数fun1()

     fun1(&b,&c)
    

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

    因此,通过值传递意味着,我们希望使用值而不修改调用函数中存在的原始指针(main())。但是我们通过引用传递,当我们需要任何显着的变化时,应该反映我们的调用函数(main())本身。
    我希望,这可以消除疑问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2021-11-02
      相关资源
      最近更新 更多