今天我想说一下在c中字符串常量的问题。在这里首先要先说明一下,我们知道,在程序中数值型常量在编译后并不是存在数据段之中,而是直接作为立即数存在程序之中,也就是说,程序编译后,该数值型常量就存在程序之中,当程序执行过程中,并不需要在数据段提取。
类似汇编中的
Mov a,#12
而字符串常量就不同了。
当我们在程序中使用字符串常量时,它是被存在常量区,常量区的数据是不能更改的,而且它是有地址的,是可以像正常的变量一样通过地址来访问的,只不过特殊的一点是他们的值不能改变。
#include<stdio.h>
#include<string.h>
int main()
{
char *p="you are better"; //将指针指向该字符串首个字符的地址
*p='a';
}
当你试着去运行这段程序的话,你会发现程序会奔溃,因为你试图改变常量区的数值,而这是不允许的(例如rom存储器的数据是不能更改的)
下面这段程序是正确的,我们可以发现,这里只不过是改用数组来接收该字符串
#include<stdio.h>
#include<string.h>
int main()
{
char a[10]="you arebetter";//
*a='a';
}
然而,这里的情况和上面截然不同,因为在这里,程序在堆区为数组开辟一段空间,而只不过是把字符串常量的值复制到该数组上,这里访问的不再是字符串常量区了,而是堆区中的单元。
值得说明的是,在一个程序中,不管用什么程序中用过几次同一个字符串常量,程序建立一次该常量。
#include<stdio.h>
#include<string.h>
int main()
{
char *p="huang";
char *pt="huang";
printf("%d\n",p);
printf("%d",pt);
}
以上两个输出结果是一样的(当然,好像地址不是这个格式,这里为了简便)。
个人拙见,见识有限,有错误请原谅。欢迎交流。