上一主题下一主题
关键字
主题 : c语言 指针在自定义函数中改变主函数的变量的值时
级别: 北风技术菜鸟


UID: 472906
精华: 0
发帖: 1257
威望: 4436 点
学点: 3032 点
贡献: 167 点
好评: 0 点
学币: 20 个
注册时间: 2014-07-10
最后登录: 2015-04-06
楼主  发表于: 2015-03-03 00:51||

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

假设主函数中有一个变量 a,然后在自定义函数中通过指针改变主函数的变量 a 的值,那么有一个小疑问:变量 a 的作用域只存在主函数,自定义函数运行时难道可以通过指针取得不在该函数作用域内的 a 变量的地址吗?
此帖悬赏中(剩余时间:已结束)...
最佳答案: 2 学点
热心助人剩余点数: 1 学点
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
沙发(1楼)  发表于: 2015-03-03 00:54||

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


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
板凳(2楼)  发表于: 2015-03-03 00:54||

自定义函数运行时难道可以通过指针取得不在该函数作用域内的a变量的地址吗? ;>AL`M+  
是的,你说的没错。不信可以把地址打出来看看: MdXchO-Lyc  
Wy ZL9K{?  
void func(int *p){ x ul]m*Z  
    printf("in func: %d", p); ]>+PnP35G  
} aDehqP 6vf  
EZYBeqv  
int main(){ 8@PX7!9  
    int a = 1; !wWJ^Oz=  
    printf("in main: %d", &a); V~ TWKuR  
    func(&a); 8HZs>l  
    return 0; cW{1 Pz^_  
}
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
地板(3楼)  发表于: 2015-03-03 00:54||

这是个拗口令式的逻辑. ZlM_ m >,o  
Jr ?!Mh-  
a = 2; 变量a的作用域在 main 中, 实际上是告诉编译器:a 这个符号在 main 中特指某段内存上的值. R~c1)[[E  
p = &a; 这里指针p也是一个变量, 作用域仍然在main中. 我们也能说 p这个符号的作用域在main中. N !IzB]  
但是p的值, 也就是一个32位的地址, 实际上是一个32位的字面值好之前的2是一样的类型. AF[>fMI  
作用域是变量的概念. 我们可以说变量a 和 指针变量p 有作用域. QN #)F  
2 和 a的地址 是字面值, 没有作用域的概念.
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
地下室(4楼)  发表于: 2015-03-03 00:54||

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