p[] 与 *p 的不同之处

刚在csdn上看到的,摘抄记录。

网友提问:
char *strA()
{
char p[] = "Hello word";
return p;
}

char *strA()
{
char *p = "Hello word";
return p;
}

这两个说下面的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变量被消灭。因此其地址没有意义。所以此时返回存在严重问题。

总之一句话,你返回的东西一定是要存在此的。并且是函数调用完返回后还是存在的----这是重点。


转自: http://www.liweifan.com/2010/12/26/difference-array-p-pointer-p/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值