C语言程序设计(24)

56 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

字符串常量

"Hello"

"Hello"会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0;

两个相邻的字符串常量会被自动连接起来。

C语言的字符串是以字符数组的形态存在的;

不能用运算符对数组做运算;

通过数组的方式可以遍历字符串;

唯一特殊的地方是字符串字面量可以用来初始化字符数组。

字符串常量

例:

#inlcude<stdio.h>

int main()

{

    int i=0;//本地变量

    char *s="Hello,world";

    char *s2="Hello,world";

    printf("&i=%p\n",&i);

    ptintf("s=%p\n",s);

    ptintf("s2=%p\n",s2);

    return 0;

}

结果为:

image.png

有三个本地变量i,s,s2,i的值直接为0,s指向了某个地方的字符串,那里有字符数组Hello,word\0,s2和s指向了相同的地方,而这个地方的地址很小,属于程序的代码段,而且是只读的。

char *s="Hello,world";编译器会将字符串的内容放在只能读不能写的地方

s是一个指针,初始化为指向一个字符串常量;

由于这个常量所在的地方,所以实际上s是const char *s,但是由于历史的原因,编译器接受不带const的写法,

但是试图对s所指的字符串做写入会导致严重的后果。

如果修改字符串,应该用数组:

char s[]="Hello,world";此时定义的字符串就位于s所处的位置附近。(位于本地变量附近)

指针还是数组?

char *s="Hello"

char word="Hello"

数组:这个字符串就在这里;

作为本地变量空间自动被回收;

指针:这个字符串不知道在哪;

单纯表达一个字符串,这个字符串不会被修改;

作为函数参数,处理参数;(反正无论是数组还是指针,作为参数被传入函数之后都会变为指针)

动态分配空间(字符串空间是通过malloc得到的,只能用指针)。

总结:如果要构造一个字符串->数组

如果要处理一个字符串->指针