| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 609 人关注过本帖
标题:指针的理解
只看楼主 加入收藏
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
结帖率:87.93%
收藏
已结贴  问题点数:20 回复次数:2 
指针的理解
int *cp1=12;
系统会报错:cannot convert from 'const int' to 'int *'
这个能理解,指针并没有分配内存,当然不能对指针指向的对象赋值

char *cp="C++";
能正常运行,这个就难以理解了,不知这两者应该怎样理解
搜索更多相关主题的帖子: 指针 
2010-04-19 15:38
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:20 
http://faq.

2010-04-19 15:58
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
谢谢你的指点
我转过来吧

 问题内容:char *p="1234567890",这样的定义有问题吗
原讨论链接:http://community.
所属论坛:C语言     审核组:C/C++
提问者:wujie0978_cn     解决者:EnochShen
感谢:dongpy、jinus、goodluckyxl、21cnbao、EnochShen、whyglinux
关键字:
答案:
char *p="1234567890";
这个语句有什么毛病吗?
指针可以这样初始化吗???
如果可以的话:这个"1234567890"字符串系统会把它分配在内存什么地方?
---------------------------------------------------------------

这个"1234567890"字符串不再堆上也不在栈上!而是在文字常量区.而指针p在栈上

文字常量区:常量字符串就是放在这里的.程序结束后由系统释放.


比如:

int a = 0; 全局初始化区  
char *p1; 全局未初始化区  
main()  
{  
int b; 栈  
char s[] = "abc"; 栈  
char *p2; 栈  
char *p3 = "123456"; 123456\0在常量区,p3在栈上。  
static int c =0; 全局(静态)初始化区  
p1 = (char *)malloc(10);  
p2 = (char *)malloc(20);  
分配得来得10和20字节的区域就在堆区。  
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。  
}


---------------------------------------------------------------

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放  
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
---------------------------------------------------------------

>> char *p="1234567890";
>> 这个语句有什么毛病吗?

这个语句是有问题的,解释如下:

"1234567890"是一个字符串常量,C和C++的标准都规定:任何试图改变字符串常量的行为其结果是“未定义的”。但是上述语句的指针定义却不能阻止通过指针 p 来改变字符串常量"1234567890"的这种行为,比如:*p = 'a';,编译器发现不了这个错误。

正确的定义方式应该是:const char *p="1234567890";

>> 指针可以这样初始化吗???
回答又是可以的。由于历史的原因,标准在这一点上作了一些“妥协”:既允许字符常量指针自动转换为非常量指针。但是使用者应该知道这样做存在着上述问题。因为这个原因,C++标准把这种转换标记为“Deprecated”,应该避免使用。

2010-04-19 16:24
快速回复:指针的理解
数据加载中...
 
   



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

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