刚在csdn上看到的,摘抄记录。
网友提问:
这两个说下面的p为全局变量,为什么?
选取对自己有价值的回答保存:
char p[] = "Hello word";地址不可变;数组空间在堆栈段开辟,内容可变。
char *p = "Hello word";地址可变;指向常量区,常量区中的内容不可变。
"Hello word" 是静态常量。在静态存储区。函数执行过程中一直存在。假如说它的地址为0x01 。那么
char *p = "Hello word" printf ("%p",p)的结果就是0x01
但是如果是char p[] = "Hello word" 它是使用了strcpy 把"Hello word"拷贝到p所在的地方。这个时候你打印p的值,肯定不是0x01 ,这个时候的p只是在栈中开辟的空间,函数执行完毕,就会回收的。
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
p[] 中在函数内部定义,属于局部变量,并且p[]中的p是属于地址(本来就是地址)。因此不能返回局部地址。
*p中的p同样是变量,但是p不是地址。p的地址是&p. 这里的return p只是返回此变量的值。这种语法,在任何编译器内都是合法的。但要注意的是,p作为变量,其存的值,也就是其它变量的地址,不能在函数返回时消失。
如果是这样:int i=100;
int *p=&i;
return p;
合法,但是返回时i变量被消灭。因此其地址没有意义。所以此时返回存在严重问题。
总之一句话,你返回的东西一定是要存在此的。并且是函数调用完返回后还是存在的----这是重点。