假设主函数中有一个变量 a,然后在自定义函数中通过指针改变主函数的变量 a 的值,那么有一个小疑问:变量 a 的作用域只存在主函数,自定义函数运行时难道可以通过指针取得不在该函数作用域内的 a 变量的地址吗?
假设主函数中有一个变量 a,然后在自定义函数中通过指针改变主函数的变量 a 的值,那么有一个小疑问:变量 a 的作用域只存在主函数,自定义函数运行时难道可以通过指针取得不在该函数作用域内的 a 变量的地址吗?
自定义函数运行时难道可以通过指针取得不在该函数作用域内的a变量的地址吗?
是的,你说的没错。不信可以把地址打出来看看:
C
void 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 变量的地址吗?
可以
给自定义函数传递“指针类型的参数”,就能解决了
void fun(int *p){
...
}
int main(){
int a = 1;
fun(&a);
return 0;
}
你只fun()函数里面修改*p
(不要漏了*
)的内容就相当于修改a的内容
1 回答1.4k 阅读
1 回答1.1k 阅读
1 回答922 阅读
870 阅读
816 阅读
731 阅读
677 阅读
自定义函数
通过指针
改变主函数的变量,指针是凭空变出来的么,需要从主函数里通过&a
等方式把变量a
以地址引用的方式传递给自定义函数, 这时候你控制的不是变量a
,而是它对应的那个内存单元,变量名a
只是这个内存单元的一个标记符号,而自定义函数获得的指针,是另一个标记