c语言 指针在自定义函数中改变主函数的变量的值时

假设主函数中有一个变量 a,然后在自定义函数中通过指针改变主函数的变量 a 的值,那么有一个小疑问:变量 a 的作用域只存在主函数,自定义函数运行时难道可以通过指针取得不在该函数作用域内的 a 变量的地址吗?

阅读 10.2k
7 个回答

自定义函数通过指针改变主函数的变量,指针是凭空变出来的么,需要从主函数里通过&a等方式把变量a以地址引用的方式传递给自定义函数, 这时候你控制的不是变量a,而是它对应的那个内存单元,变量名a只是这个内存单元的一个标记符号,而自定义函数获得的指针,是另一个标记

自定义函数运行时难道可以通过指针取得不在该函数作用域内的a变量的地址吗?

是的,你说的没错。不信可以把地址打出来看看:

Cvoid func(int *p){
    printf("in func: %d", p);
}

int main(){
    int a = 1;
    printf("in main: %d", &a);
    func(&a);
    return 0;
}

这是个拗口令式的逻辑.

a = 2; 变量a的作用域在 main 中, 实际上是告诉编译器:a 这个符号在 main 中特指某段内存上的值.
p = &a; 这里指针p也是一个变量, 作用域仍然在main中. 我们也能说 p这个符号的作用域在main中.
但是p的值, 也就是一个32位的地址, 实际上是一个32位的字面值好之前的2是一样的类型.
作用域是变量的概念. 我们可以说变量a 和 指针变量p 有作用域.
2 和 a的地址 是字面值, 没有作用域的概念.

作用域指的是编译阶段变量的可见范围,并不表示内存的可访问性

在主函数中把a的指针传给自定义函数的同时就是把a的地址传给了自定义函数。

变量有作用域

自定义函数运行时难道可以通过指针取得不在该函数作用域内的 a 变量的地址吗?

可以

给自定义函数传递“指针类型的参数”,就能解决了

void fun(int *p){
    ...
}
int main(){
    int a = 1;
    fun(&a);
    return 0;
}

你只fun()函数里面修改*p(不要漏了*)的内容就相当于修改a的内容

int a = 9;
void fun()
{
int *p = a;
*p = 9;
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏