注: 本文参考了网络上部分资料,来源未知。如作者看到,请与我联系。
长为n的字符串在内存中连续存放,每个字符存贮其ASCII码,占一个字节,共n个字节,最后填一个全0字节作为串的结束标志。空串也有一个字节,即只有结束标志字符'\0'。
2.程序中怎样存贮字符串
①用字符数组存贮串。
本质上,字符串是一种字符型数组,并且这个数组的最后一个单元的值是'\0';
也就是说,字符串是一种以'\0'结尾的字符数组。
例:char s[4]; /* 用字符串初始化一个字符数组*/
char s[41] = {"ABCD"};
char s[41] = "ABCD";
char s[41] = {'A','B','C','D','\0'};
②用字符串常量初始化一个字符指针变量建立串.
字符串常量就是用双引号括起来的一组字符;
char *s="ABCD";
"ABCD"是字符串常量,存放在程序的静态数据区,
s得到的是串"ABCD"的首地址,即字符A的存贮地址。
s[0]为'A',s[4] = 0
③用内存分配函数建立串
char *t;
t = (char *)malloc(81);
strcpy(t,"DEF");
……
free((void *)t);
3.几个例子:
(1)不可通过字符指针改变其指向的字符串常量的内容。
const char* pStr="Let it be what it can be, man!";
char StrArray[]="ABCDE";
printf("Str is %s\n", pStr);
*pStr="Hey,man!";
*(pStr+1) = "h";
点评:pStr是一个字符指针,指向字符串常量的内存首地址。*pStr对该指针解引用,实际为字符串常量的内容,即为字符。
而"Hey,man!"是另外一个字符串常量。无法将一个字符串常量强制转换为字符,实际意义为你不能改变一个常量字符串的内容。
对于*(pStr+1),道理雷同,不再赘述。
(2)可以改变字符指针的指向:
const char* pStr="Let it be what it can be, man!";
char StrArray[]="ABCDE";
printf("Str is %s\n", pStr);
pStr="Hey, Man!";
printf("Str is %s\n", pStr);
编译和运行可知,编译通过,且字符指针指向的内容有改变。
const char* pStr="Let it be what it can be, man!";
char StrArray[]="ABCDE";
printf("Str is %s\n", pStr);
pStr="Hey, Man!";
printf("Str is %s\n", pStr);
StrArray[0]='a';
printf("Str Array Content is %s.\n", StrArray);
运行可知,字符数组第一个元素变为了小写a.
char *GetMemory(void)
{
char str[]="hello world"; //str数组创建在栈上,并用字符串常量来初始化.
//str是在栈上分配的内存,函数结束后将会自动释放,str指向的内存区域内容不是"hello world",而是未知的内容。
return str; //该句存在隐患,str指向的内存单元将被释放
}
const char *Func(void)
{
char *pCh="Test String"; //字符串常量存放在程序的静态数据区,
//pCh指针虽然是在栈上定义的,但当函数返回时,它指向的那个内存地址,也就是字符串“Test String”还是存在的,并没有被释放
return pCh; //返回字符串常量的地址,没有问题
}