【问题标题】:C pointer referencing another pointer in functionsC指针在函数中引用另一个指针
【发布时间】:2015-03-02 21:55:40
【问题描述】:

我发现如果你在函数中将一个指针地址分配给另一个指针的地址,它不会改变 main 中的 in 值, 然而,通过在 main 中做同样的事情,它会改变。那么这是什么原因呢?

void func(int *a, int *b){
     b = a;
 }


int main(){
   int i= 5, k =6, *a=&i, *b=&k;
   printf("%d %d\n",*a,*b);  //output 5 6
   b = a;
   printf("%d %d\n",*a,*b);  //output 5 5

   a=&i;
   b=&k;
   func(a,b);
   printf("%d %d\n",*a,*b);  //output 5 6
   printf("%d %d\n",*a,*b);  //output 5 6
}

【问题讨论】:

  • 因为你是通过拷贝传递指针,然后又改变了指针的拷贝。
  • 顺便说一句,您永远不会调用该函数。这是复制错误吗?

标签: c pointers


【解决方案1】:

在这个函数中

void func(int *a, int *b){
     b = a;
 }

参数 a 和 b 是函数的局部变量。退出函数后,它们将被销毁。该函数处理参数的副本。如果您希望该函数自己更改原始参数,则必须将指针传递给它们。例如

void swap(int **a, int **b){
     int *tmp = *a;
     *a = *b;
     *b = tmp;
 }

【讨论】:

    【解决方案2】:

    你的功能:

    void func(int *a, int *b){
         b = a;
     }
    

    什么都不做,它只是将两个代表内存地址的值作为参数,并将一个分配给另一个,而没有任何外部影响。它只是将一个的值写入另一个(可能甚至不会,因为编译器可能会检测到这是毫无意义的并完全消除它),它不会对存储在这些地址的信息做任何事情。您将需要遵循指针来读取或写入它保存值的内存地址,但在目前的形式中,该函数不会将指针分配给另一个,而是将i 的值分配给k。

    如果你想让一个函数改变它之外的参数,你应该通过引用传递,在C中只是通过指针传递,所以你需要传递一个指向指针的指针,而不是指针——它将传递一个该指针的副本 - 相同的值,作为指向指针的指针传递时将传递指针在内存中的地址,而不是它所保存的值。

    应该是这样的:

    void func(int **a, int **b){
         *b = *a;
     }
    

    和func(&a,&b),您将通过b = a 重现您在main 中所做的事情。

    【讨论】:

    • 这里没有无符号整数
    • 指针是内存地址,内存地址是无符号整数。 “指针”只是无符号整数的词法抽象。这不是什么“魔法”,只是一个无符号整数。
    • 也许我应该解释一下上帝和我的人生目的?现在你只是在吹毛求疵。我将指针仅作为数字呈现给 OP 是有原因的,因为这样他将能够比将指针视为神秘的魔法更好地理解这个概念,这就是人们首先在获取指针时遇到问题的 N1 原因。
    • 人们对指针有问题的第一个原因是他们被告知指针是整数(并且数组是指针),然后当它们的行为不像整数时会感到困惑。将指针视为指向的东西要简单得多。 int * 指向 int。将1 添加到它,它指向下一个int。添加两个指针 - 没有意义(因此,不可能)。减去int * 类型的两个指针 - 告诉您两者之间有多少ints。减去两个不同类型的指针——没有意义;不可能。整数的行为不一样。
    • @MattMcNabb - 不,它不会,因为它不会说明它仍然是一种将一个数字分配给另一个数字的行为。那么上下文将是“将一个内存地址分配给另一个”......究竟是什么?这是否意味着会有两个具有相同地址的内存单元?一点也不混乱,除了完全可能的 /s ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多