开篇:数组中可能会包含指针。
内容:指针数组。
演化:整数数组 --> 小数数组 --> 字符数组 --> 指针数组
int a[10]; --> float a[10]; --> char a[10]; --> char * a[10];
功能:这种数据结构常用来构造字符串数组。
说明:字符串数组中的每一元素都是一个字符串。但是,因为在C语言中,字符串实际上是指向字符串第一个字符的指针,所以字符串数组中的每一个字符串实际上是指向字符串第一个字符的指针。
以如下程序中的字符串数组suit的声明为例(suit代表一副牌的四种花色):
main()
{
int i;
char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades"};
for(i=0; i<4; i++)
printf("The address of string \"%s\" is %p \n", suit[i], suit[i]);
return 0;
}
以上代码在VC环境下运行。
输出:
The address of string "Hearts" is 00420024
The address of string "Diamonds" is 00420FB4
The address of string "Clubs" is 00420FA4
The address of string "Spades" is 0042001C
调试结果:
Name Value
- suit 0x0012ff6c
+ [0] 0x00420024 "Hearts"
+ [1] 0x00420fb4 "Diamonds"
+ [2] 0x00420fa4 "Clubs"
+ [3] 0x0042001c "Spades"
Memory:
0012FF61 CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫.
0012FF6C 24 00 42 00 B4 0F 42 00 A4 0F 42 $.B...B...B
0012FF77 00 1C 00 42 00 CC CC CC CC C0 FF ...B.烫烫..
1. suit[4] :表明数组有4个元素。
2. char * :表明数组suit的每一个元素是指向char类型的指针。
3. 放在数组中的四个值是"Hearts“、"Diamonds"、"Clubs"、"Spades",每一个值都是以NULL字符终止的字符串,长度比引号之间的字符个数大1,分别是7、9、6、7。
4. 尽管这些字符串好象是存储在suit数组中的,但是,数组中实际上只存储了指针,每一个指针都指向其对应字符串的第一个字符。因此,尽管数组suit的大小是固定的,但是它访问的字符串可以是任意长度。这种灵活性是C语言强大的数据构造能力的一个例证。也可以把四个花色放在二维数组中。数组中的每一行代表一种花色,每一列代表花色名中的一个字母。这种数据结构的每一行得有固定的列数,并且列数要能够容纳最长的字符串。因此,如果其它的字符串都比最长的字符串短得多的时候就会浪费大量的内存。

浙公网安备 33010602011771号