使用函数更改指针包含的地址
如果我已经将指针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; }