| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1266 人关注过本帖
标题:[求助]*p和p[]的求别
只看楼主 加入收藏
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
回复:(qq95620412)回6楼: 既然是用 *p=

hello的空间不会释放,在程序运行期间,字符串"hello"一直处于数据段内,指向它的地址也没有发生变化,每次调用getmemory()都会返回相同的地址,共同维护同一份拷贝。你可以通过下面一段代码测验一下:

#include<stdio.h>
char *GetMemory(void)
{
char *p="Hello";
return p;
}

int main()
{
char *str = NULL;
int i=1;
while(i)
{
str = GetMemory();
printf("%s\n",str);
printf("字符%c的地址:%x\n",*(str+1),str+1);
printf("输入数字0结束:");
scanf("%d",&i);
}
return 0;
}


英者自知,雄者自胜
2007-11-07 14:18
学c
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2007-9-17
收藏
得分:0 

明白以下两点:1:const char *const p="hellow"
2: 什么是静态变量,什么是动态变量,什么是动态存储区,常量存储区

2007-11-07 16:08
mebol
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-10-7
收藏
得分:0 
有点难懂
2007-11-07 20:55
jxj777
Rank: 1
等 级:新手上路
帖 子:91
专家分:0
注 册:2007-10-27
收藏
得分:0 

子函数中变量如在栈区,则不可返回栈区的指针或地址,只可返回值
P[]为局部变量,存在栈区
*p动态指针,分配在堆区,把以不存在上述限制


一个人的力量是缈小的....... 互帮互助才是出路
2007-11-07 21:02
yixiaowz
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2007-11-3
收藏
得分:0 
七楼的也不对哦,是乱码!

2007-11-07 21:56
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 
回11楼:

那系统是将"hello"的地址存放在哪里呢?又如何保证系统每次调用函数getmemory()时都去访问该地址,而不是新开辟一块内存呢?

人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 22:29
flyaway57
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-3-28
收藏
得分:0 
#include <cstdio>

char* get_str()
{
char *str = {"abcd"};//可以
//char str[] = {"abcd"};//错误,结果不确定
return str;
}

int main()
{
char* p = get_str();
printf("%s ", p);

return 0;
}

char *str = {"abcd"};//可以,是因为"abcd"是一个字符串常量,它并不在一个栈空间上,而是在静态存储区上。
字符串的生命周期是:程序开始时分配,程序结束时释放。
(当然,str是一个指针变量,在栈空间上,因此函数返回时会释放,但是所指为字符串常量,字符串常量所占空间在函数返回时不会释放)

而char str[] = {"abcd"};//错误,结果不确定,虽然从编译器的实现来看(见如下代码(VC6下)的结果),"abcd"仍然是当成一个字符串常量,但是程序又把它复制了一次,放在了栈空间上,返回的时候str所指的是栈上的这一块字符串。问题的本质仍然是由于返回了指向栈空间的指针。

//5: char *str = {"abcd"};
//00401038 mov dword ptr [ebp-4],offset string "abcd" (0042201c)
//6: return str;
//0040103F mov eax,dword ptr [ebp-4]

//5: char str[] = {"abcd"};
//00401038 mov eax,[string "abcd" (0042201c)]
//0040103D mov dword ptr [ebp-8],eax
//00401040 mov cl,byte ptr [string "abcd"+4 (00422020)]
//00401046 mov byte ptr [ebp-4],cl
//6: return str;
//00401049 lea eax,[ebp-8]

这是我在其他地方看到的解释
就麻烦高手们给解释下这段汇编的意思了

戒骄戒躁
2007-11-08 01:41
chmlqw
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-10-11
收藏
得分:0 
10  好象没有 printf(str)这种用法吧
2007-11-08 12:30
lw_China
Rank: 1
来 自:peking
等 级:新手上路
帖 子:73
专家分:0
注 册:2007-11-4
收藏
得分:0 
数组和指针就是一样的...

*p, 指针也可以当数组用.. p[...]

在这里推荐一本书 <The C Programming Language>
2007-11-08 12:31
shlg1229
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2007-9-24
收藏
得分:0 
学习中~·

个人意见,不代表官方看法
2007-11-08 12:53
快速回复:[求助]*p和p[]的求别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014640 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved