一、字符串数组
使用字符串数组可以访问多个不同的字符串
示例代码:
char *string1[3] = {
"hello world",
"C language",
"this is a quote"
};
// string1是一个由3个指向char的指针组成的数组
// string1是一个一维数组,且数组里的每一个元素都是一个char类型的地址
// 第一个指针是string1[0],指向第一个字符串的第一个字符 *string1[0] == 'h'
// 第二个指针是string1[1],指向第二个字符串的第一个字符 *string1[0] == 'C'
// 第三个指针是string1[2],指向第三个字符串的第一个字符 *string1[0] == 't'
上面示例中:
1)string1数组实际上并不存放字符串,只是存放字符串的地址,字符串在程序中用于存放常量的那部分内存中
2)可以把string1[0]看作表示第一个字符串,*string1[0]表示第一个字符串的第一个字符
3)由于数组符号和指针之间的关系,也可以使用string1[0][0]表示第一个字符串的第一个字符,尽管string1并没有被定义为二维数组
4)字符串数组初始化遵循数组初始化规则
与上面示例的声明方法不同,还有另一种方法,即建立二维数组:
char string2[3][80]; // string2是一个5个元素的数组
// 每个元素本身又是一个80个char的数组
这种情况下,字符串本身也被存储在数组里
与前面指针的形式的区别是:
1)后者建立了一个所有行的长度都相同的矩形数组;而指针数组建立的是一个不规则的数组,每一行的长度由初始化字符串决定,因此不会浪费任何存储空间
2)string1和string2的类型不同:string1是一个指向char的指针的数组,存放的是3个地址;string2是一个char数组的数组,存放的是3个完整的字符数组
二、指针和字符串
在对字符串的处理过程中不可避免地会经常用到指针,绝大多数C字符串的操作使用的都是指针
示例代码:
#include <stdio.h>
int main(void)
{
char * msg = "don't forget your mission!";
char * copy;
copy = msg;
printf("%s\n", copy); // 打印copy所指向的内容
printf("\n");
printf("msg = %s, &msg = %p, value = %p\n", msg, &msg, msg);
printf("copy = %s, © = %p, copy = %p\n", copy, ©, copy);
return 0;
}
运行结果:
结论:
1)字符串并没有被复制,因为copy指定的指针的值与msg指定的指针的值相同,指针的值是该指针中存放的地址,二者相同
2)copy = msg的作用:并不是对字符串进行赋值,而是产生了一个指向同一个字符的第二个指针(copy)