上一主题下一主题
关键字
主题 : 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变量的地址吗? &<dC3o!  
是的,你说的没错。不信可以把地址打出来看看: bqPaXH n  
Y9<N#h#  
void func(int *p){ E^s<5BC;  
    printf("in func: %d", p); OKo)p`BX  
} U~CG(9  
s2f6;Yc  
int main(){ TKH!,Ow9A  
    int a = 1; 2|a5xTzH  
    printf("in main: %d", &a); {u}d`%_.M  
    func(&a); 6Mc&gnN  
    return 0; 9M12|X\]8  
}
级别: 北风资深评论员


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

这是个拗口令式的逻辑. (K_{a+$[  
&["e1ki  
a = 2; 变量a的作用域在 main 中, 实际上是告诉编译器:a 这个符号在 main 中特指某段内存上的值. Z~].v._YV)  
p = &a; 这里指针p也是一个变量, 作用域仍然在main中. 我们也能说 p这个符号的作用域在main中. 5>lIrBf  
但是p的值, 也就是一个32位的地址, 实际上是一个32位的字面值好之前的2是一样的类型. K^ ALE  
作用域是变量的概念. 我们可以说变量a 和 指针变量p 有作用域. v[r 8-0c  
2 和 a的地址 是字面值, 没有作用域的概念.
级别: 北风资深评论员


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

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