抗议雨中飞燕!!说话吞吞吐吐!!不解释明白,装酷吗??????
很多基础的东西,是你要去看书的,不是等着人家来讲的...
----------------解决方案--------------------------------------------------------
注意不同系统不一样的内存管理模式
----------------解决方案--------------------------------------------------------
内存管理模式中关于平时我们说的堆和栈有什么区别?一般情况下用哪个比较好...
----------------解决方案--------------------------------------------------------
这个小问题竟然讨论了4页,连knocker都惊动了,我也来凑下热闹。
我是这样理解的,大家看对不对
1、char* a = "abc"; 声明了一个字符类型的指针a,并为它赋值初始值为"zhf"其中字符串"zhf"应属于全局静态存储区,这里对a[1] = 'k',在编程中会出错,高手解释一下为什么?这里 a = null,可以,容易理解,因为a是指针类型。
2、char a[] = "abc"; 声明了一个字符型数组,并赋初值。这里的字符串"zhf"应该是属于堆存储区,是在局部开辟的空间。所以,这里对a[1] = 'k';是正确的。由于数组类型a相当于一个const型的指针,所以a = null;会出错。
欢迎高手纠正、补充。
1.这里的a是一个变量,一个指针变量,初值为一个字符串的首地址。C++中建议这样声明:const char* const a = "abc";因为字符串常量理论上不允许修改(否则何必叫常量?),在TC中你修改也没事,DOS中程序员是上帝;vc中不能修改,windows会保护常量数据(内存分页保护),修改时会终止程序给出该内存不能为written的提示。所以第一个const可以让编译器帮助检查是否有修改常量的操作,在编译期报错比运行时崩溃强。第二个const保证a的值不会被修改,否则数据"abc"就丢失了,以后访问不到了。
2.这里a是数组名,数组中存储的是变量,可以随意修改。不过a的值是不能修改的,因为a不是变量而是一个地址标号,一个常量,上面的a是变量是lvalue,这里的a是只有读属性的rvalue。举个例子:int array[5]; array=3; 这里修改a就和修改array一样的错误。
讨论结束,可以鼓掌了。。。。
-----------------------------------------------------------------------------------------------------------
char *a="sss";
严格来说这个语句是错的
为什么错了,你也不说说原因,难怪29楼有人这么说呢:
31楼的coachard就知道帮她说话
----------------解决方案--------------------------------------------------------
楼上的版主能不能给我讲一下堆和栈的区别?堆分配和栈分配的最大不同点是什么?
----------------解决方案--------------------------------------------------------
char *a = "abc" 是声明了A是一个字符类型的指针,并指针的指向是字符串abc在内存中的首地址,在程序的运行中,*a能做运算,比如while (i<3)
{a++};要说明的是此时的a是变量,是指针变量,而不是常量;运行程序 之后做a++,此时a的指向是b的地址了相当于*a=b了。
char a[] = "abc" 这个是给数组a赋值的,这儿的=是表示 赋值运算符;应该注意的是此时的a 是字符串常量,它的值不能运算,还有一点是 在c语言中,程序运行的时候他允许这样:*(a+i)它相当于a[0+i].
各位 前辈们 我是新手 有错的地方 还请指出来
----------------解决方案--------------------------------------------------------
char* a = "abc";
convert `const char*` into `char *` error
by 雨中飞燕 QQ:78803110 QQ讨论群:5305909
[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
----------------解决方案--------------------------------------------------------
char* a = "abc";
convert `const char*` into `char *` error
知道了。以前一直没注意这个问题。
你早点这么说也不会有人说你装酷了
----------------解决方案--------------------------------------------------------
自己简单的理解:
char* a = "abc";
编译器把字符串"abc"做为常量所分配的节区类似与 win32中的 .const数据段
.const数据段的属性是由程序运行的时候操作系统为其建立的,它的属性由在GDT中为该任务建立的LDT中存在的数据段描述符来表示,
具体于 "abc"所在的数据段 所属的段描述符的type 4位属性为 数据段 可读 不可写 ,
我们的程序的cs段的 rpl和cpl 是3级 也就是最外级,当对属性为可读不可写的数据段 进行写操作的时候,cpu自己判断我们的程序不具有该权限,
所以产生一个保护性中断,交由操作系统来处理.操作系统产生1个对话框.
----------------解决方案--------------------------------------------------------
我觉得这是编译器的问题,当编译器接受到a[i]时,会自动转化为*(a+i),当然前提条件你要声明数组的存在;如果用指针就必须用*(a+i),因为这时候编译器不知道a[i]是什么。
----------------解决方案--------------------------------------------------------