如果我已将指针p
声明为int *p
;在主模块中,我可以通过分配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;
}
地址内容不变。将函数用于同一任务有什么问题?
答案 0 :(得分:34)
在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 ++,另一种方法是更改函数以接受对指针的引用。
答案 1 :(得分:11)
在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
答案 2 :(得分:2)
如果你想改变C中函数中变量的内容,指针也是一个变量,你必须通过指针或间接引用使用始终&
地址和*
解除引用运算符。我的意思是在更改变量值时始终使用*
运算符。
#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;
}
答案 3 :(得分:1)
对于原始数据类型(如int
),双指针不是必需的。您可以直接写入存储int
的地址,将其地址视为被调用函数中的指针。这与char
数组(&#34; string&#34;)不同,其中指向的大小是可变的,因此在从被调用函数中更改它时必须使用另一级别的间接。试试这个:
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;
}
答案 4 :(得分:0)
这不会改变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;
}