指针和字符串常量 指针常量和指针变量
char a[]="hello";
a[0]='X';//ok
printf("%s ", a);
char *pl="world";
pl[0]='H';//运行时错误
*pl='X';//运行时错误
printf("%s ", pl);
char *s=NULL;
s=(char*)malloc(sizeof(char)*6);//让俺的s到堆上去
strcpy(s, "hello ");
s[0]='x';//ok
printf("%s ", s);
"hello "是字符常量。但char *s定义的是字符指针的。
s[0]= 'X ';当然是错误的,因为s[0]其实说的就是 'h '啦,h是常量来的,当然不能修改,假如你需要修改的话请用。
char s[6]= "hello ";
s[0]= 'X '; 就没事了。 其实char *pl="world";最好写成const char *pl="world";;以免被误用
s不是常量
指向常量
因此在此应用中不能更改
char *s= "ddd ";
一般应该定义成 const char *s = "dddd ";
如果想修改字符串字符的值就用char a[]="hello";
下面的观点总结得很好。
void main()
{
const char *s= "hello ";//此处加了个const修饰.
s[0]= 'X ';
}
简单地说,除了存在栈和堆上的字符串才不是字符串常量.其余的都是字符串常量.
举一个例子:char buffer[20]= "hello ";这个字符串是用来初始化字符数组buffer的,存在栈上,不是一个字符串常量,可以用下标读写其值.又比如,char *p=malloc(...);
strcpy(p, "hello ");这个 "hello "也不是一个字符串常量,因为是在堆上,也可以用指针p进行读写.至于在这两者的前面加上const修饰,虽然表明 "hello "是不允许更改的,但是对于字符串来说,不能说明是字符串常量.因为,const要修饰的不是明确说hello是不可写的,而是说p指向的这段内存区域是不可写的.修饰的对象是不同的,只是恰巧这段区域里存的是hello这个字符串(说得有点绕了吧,你再坚持一下).
除了这两个情况以外,程序中出现的字符串都应该被视为字符串常量了.
比如const char *p= "hello ";这个字符串是存放在静态存储区上的,是不可以更改的.它的有效范围是整个程序的生命期.如果有另外的语句p= "nb ";那么,hello这个字符串将会永远不被引用,但是它会存在于整个程序的生命期.这才是真正的字符串常量.
这与i386的运行模式有关,现在大部分程序是32位的,一般都是运行在保护模式下,这种模式可以设定某个数据段不能write。
但TC的程序是16位实模式的,数据段无所谓read/write限制,甚至连代码段都是可以write的。
更多阅读
浅谈内存分配方式以及堆和栈的区别 栈的内存分配
对于一个程序要运行,涉及到的内存分配是一个首要问题,这里简单说一下一个简单的程序运行所涉及到的内存分配方式。另外,在数据结构中存在堆和栈的概念,栈是一种先进后出的数据结构,堆则是一种排序方式,而在内存分配中也存在堆(heap)和栈(stac
C语言--静态变量和动态变量初始化区别 c语言局部变量初始化
补充:c里等号的意义是分两种情况,一种是在表达式里,而另一种是在变量声明中。 在变量声明中的等号不可以看作是赋值,它只是初始化,也就是说它的意义只是告诉编译器如何初始化这个内存空间。而表达式中的 =就是赋值的意思了。 自动变量和
二维数组与数组指针的用法 二维数组指针传递
二维数组与数组指针的用法 严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构
C++ 基本的数据类型二 字符型常量的表示方法 字符串常量 类型转换
前文介绍了一些基本的数据常量,这里我们主要来接触字符常量和字符串常量。首先,是最小单位的常量boolean常以及最简单的字符常量。布尔类型常量只有true和false两个值,常用的赋值方式如 bool test=fa
关于指针变量在内存中所在的长度(转载) 定义指针变量
作者:又是一年夏天 | 出处:博客园 | 2011/6/24 14:27:15 | 阅读9次32系统指针变量是4byte,我在xp下用vc6.0测试出4byte,tc是2byte为什么?不同的计算机是不一样的.32位的是4个字节,也就是现在用的最多的(64位快了...),16位就是2个字节.虽然是1