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

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

 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中,variables是按值传递的 – 指针的副本被传递给函数。 改用另一个指针指针:

 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 

对于像int这样的基本数据types,双指针是不必要的。 您可以直接写入存储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);

或者,你有其他的方法:改变函数的返回types并捕获返回的地址。

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

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

 #include <stdio.h> #include <stdlib.h> 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; }