如果我说字符串也属于指针类型,你会信吗?其实大家在学习C语言基础的时候,都会把字符串当作字符类型处理,当然按照初学者的水平一般是不会出错的。但是事实上,字符串真的是只是属于字符类型的吗?那我今天就告诉你,并不是这么简单的。从功能上看,说字符串属于字符类型,这是没有任何错误的。但是如果你细究字符串在C语言中的运行的机制的话,字符串属于指针类型。
之所以说字符串常量是属于指针类型,是由于在程序中使用字符串常量会生成一个“指向字符串的常指针”。当一个字符串常量出现在一个表达式中时,表达式所引用的值是存储该字符串常量的内存首地址,而不是这些字符本身。
因此,用户可以把字符串常量赋值给一个字符类型的指针,用于指向该字符串在内存中的首地址。我们可以这么做。1
2char *p; // 创建字符类型的指针变量p
p = "abcd"; // 直接将字符串变量abcd赋值给指针p
其实在这里双引号做了3件事:
- 申请了空间(在常量区),存放了字符串
- 在字符串尾加上了’/0’
- 返回地址
而第三点的返回的地址赋值即给了p。
OK,说了这么多,直接上代码来验证一下以说明问题。1
2
3
4
5
6
7
8
int main()
{
char *p = "hello world";
printf("%s",p);
return 0;
}
再来个测试代码(我代码功力拙劣,欢迎指正)1
2
3
4
5
6
7
8
9
10
int main()
{
char *p = "hello world";
printf("\n&p is %x\n",&p);
printf("&p[0] is %x\n",&p[0]);
printf("p is %x\n",p);
return 0;
}
此处,我们具体分析一下代码运行的过程。
内存图示如下:
计算机分配了两段内存,一个名为p,类型是一个字符指针,另外一段是一个字符串常量,且p里面存放着字符串常量的首地址。
&p:p这个字符指针变量的地址
&p[0]:p所指字符常量第一个字符的地址
p:p这个字符指针的值,即字符常量的首地址
因此,最后两个的值是一样的。
除了字符串常量可以直接赋值给指针外,字符串与字符也有着巨大的区别。
字符串常量看似是字符类型,但事实上,字符串常量与字符常量有着较大的区别。字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,双引号括起的字符串中不能是双引号(“”)和反斜杠(\)。例如:”China”、”Cprogram”、”YES&NO”、”33312-2341”、”A”等都是合格的字符串常量。
在C语言中,字符串常量在内存中存储时系统自动在字符串的末尾加一个“串结束标志”,即ASCII码值为0的字符NULL,通常用‘\0’表示。因此在程序中,长度为n个字符的字符串常量,在内存中占有n+1个字节的存储空间。例如,字符串”BLOG”有4个字符,存储在内存中时占用5个字节。系统自动在字符串最后加上NULL字符,其存储形式如下图所示。
要特别注意字符常量与字符串常量的区别,除了表示形式不同外,其存储方式也不相同。字符’A’只占1个字节,而字符串常量”A”占2个字节。
OK,到此结束。
本文作者:冰羽
本文地址: https://bingyublog.com/2018/11/26/C语言中字符串变量的解析/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!