使用函数更改指针所包含的地址
如果我已经声明了一个指针p
为int *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; }