在程序中定义字符串?
#define string1 "I am String No.1"
char string2[] = "I am String No.2";
char *string3 = "I am String No.3";
上面的三行使用不同方法定义了字符串。
字符串常量 char类型数组 指向char的指针
字符串常量 属于静态存储类别(只会被存储一遍), 用双括号括起来的部分被视为指向该字符串存储位置的指针。
用char类型数组 定义字符串时, 应该注意指定数组大小时, 要保证数组的元素比字符串长度多1(用于存储‘\0’)
所有未被使用的元素都被自动初始化为‘\0’
使用指针来定义字符串与使用数组比较类似
const char *p = "I am a string";
const char ar[] = "I am a string too";
p和ar都是字符串的地址。
字符串的数组形式和指针形式的不同
数组形式
字符串常量储存在静态存储区,程序开始后则为数组分配内存。此时字符串会有两个副本:一个在静态内存中,另一个存储在ar数组中。ar是该数组首元素地址的别名,是一个地址常量 (不能更改)。
指针形式
字符串常量仍然储存在静态存储区。程序开始后,会为指针变量p留出位置,存储字符串的地址。该变量一开始指向字符串的首字符,但是其值可以改变,如p++等。
总之,初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针把字符串的地址拷贝给指针。
两者都可以使用数组表示法,也可以做指针加减法操作,但是只有指针表示法可以递增递减。
有关字符串数组
如果要用数组表示一系列字符串,使用指针数组
使用二维数组会将原本存储在静态内存中的字符串常量再复制一遍到数组中,而且每个元素大小必须相同(必须是能存下最长字符串的大小),为字符串数组分配内存的使用率较低。