使用函数更改指针包含的地址

pra*_*phy 36 c pointers function

如果我已经将指针声明pint *p; 主模块中,我可以改变所包含的地址p通过分配p=&a;其中a的另一个整数变量已经声明.我现在想用一个函数改变地址::

void change_adrs(int*q)
{
    int *newad;
    q=newad;
}
Run Code Online (Sandbox Code Playgroud)

如果我从主模块调用此函数

int main()
{
    int *p;
    int a=0;
    p=&a; // this changes the address contained by pointer p
    printf("\n The address is %u ",p);
    change_adrs(p);
    printf("\n the address is %u ",p); // but this doesn't change the address
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

地址内容不变.将功能用于同一任务有什么问题?

mat*_*975 43

在C中,函数参数按值传递.因此,复制是由您的参数组成的,并且对该副本进行了更改,而不是您期望看到修改的实际指针.如果要执行此操作,则需要更改函数以接受双指针参数并更改解除引用的参数.例如

 void foo(int** p) {
      *p = NULL;  /* set pointer to null */
 }
 void foo2(int* p) {
      p = NULL;  /* makes copy of p and copy is set to null*/
 }

 int main() {
     int* k;
     foo2(k);   /* k unchanged */
     foo(&k);   /* NOW k == NULL */
 }
Run Code Online (Sandbox Code Playgroud)

如果你有使用C++的奢侈,另一种方法是更改​​函数以接受对指针的引用.

  • 我只想指出,C标准不保证将p赋值为0会使它为null。 (3认同)
  • @JKRT:C 规范中的 6.2.3.2 表示“值为 0 的整数常量表达式,或转换为 void * 类型的此类表达式,称为空指针常量。” -- 所以分配一个文字 0 会使其为空。该句子中的“或”表示不需要强制转换。 (2认同)

小智 12

在C中,变量按值传递 - 指针的副本传递给函数.改为使用另一个指向指针的指针:

void change(int **p, int *someOtherAddress)
{
    *p = someOtherAddress;
}

int a = 1, b = 2;
int *p = &a;

printf("*p = %d\n", *p);
change(&p, &b);
printf("*p = %d\n", *p);
Run Code Online (Sandbox Code Playgroud)

这打印

*p = 1
*p = 2
Run Code Online (Sandbox Code Playgroud)

  • 纯粹因为这个答案避免了短语“双指针”而投票 (2认同)