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

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

 void change_adrs(int*q) { int *newad; q=newad; } 

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

 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; } 

地址内容不变。 将function用于同一任务有什么问题?

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

  void foo(int** p) { *p = 0; /* set pointer to null */ } void foo2(int* p) { p = 0; /* makes copy of p and copy is set to null*/ } int main() { int* k; foo2(k); /* k unchanged */ foo(&k); /* NOW k == 0 */ } 

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

在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); 

这打印

 *p = 1 *p = 2 

如果你想改变C中函数中变量的内容,指针也是一个变量,你必须通过使用always & address和* dereference运算符通过指针间接引用传递它。 我的意思是*运算符总是在改变变量值时使用并且在它之前。

 #include  #include  void changeIntVal(int *x) { *x = 5; } void changePointerAddr(int **q) { int *newad; *q = newad; } void changePPAddr(int ***q) { int **dummy; *q = dummy; } int main() { int *p; int **pp; int *tempForPP; int a = 0; printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); p = &a; pp = &tempForPP; printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); changeIntVal(&a); // ---- // |--- changePointerAddr(&p); // ---- |----> parts of what I mean // |--- changePPAddr(&pp); // ---- printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); return 0; } 

对于诸如int的原始数据类型,双指针不是必需的。 您可以直接写入存储int的地址,将其地址视为被调用函数中的指针。 这与char数组(“string”)不同,其中指向的内容的大小是可变的,因此在从被调用函数中更改它时必须使用另一级别的间接。 试试这个:

 void foo(int *oldVal) { int newVal = 99; // or whatever you want *oldVal = newVal; } int main(int argc, char *argv[]) { int someVal = 0; foo(&someVal); // we send its address to foo() printf("someVal is now %d.\n", someVal); return EXIT_SUCCESS; } 

这不会改变p的实际值,因为函数中的q是局部的,并且该函数的变化不会反映在main因此传递p的地址而不是传递p的值

请使用以下语法

  void change_adrs(int **q) { int * otheraddess; *q = otheraddress; } 

并像这样调用change_adrs(&p);

或者,您可以采用其他方法:更改函数的返回类型并捕获返回的地址。

 int* change_adrs(int *q) { int * otheraddess; q = otheraddress; return q; } int main() { p=change_adrs(p); return 0; }