C++编程:解析数组与指针的等价表示

需积分: 14 0 下载量 83 浏览量 更新于2024-07-14 收藏 8.82MB PPT 举报
"C语言谭老先生力作:等价的数组和指针定义" 在C语言中,数组和指针有着密切的关系,本题考察的是不同类型的数组和指针定义的等价性。以下是给定的四种定义方式的详细解释: 1. `char s[3][5]={"aaaa","bbbb","cccc"};` 这是一个二维字符数组,包含3个子数组,每个子数组长度为5,可以存储4个字符加上结束符'\0'。这种方式定义的数组,每个子数组都初始化为指定的字符串。 2. `char **s1={"aaaa","bbbb","cccc"};` 这是一个二级指针,`s1`是一个指向字符指针的指针。这里的字符串实际上是以字符数组的形式存储的,所以`s1`指向的是这些字符串的首地址,即字符串"aaaa"、"bbbb"、"cccc"的地址。 3. `char *s2[3]={"aaaa","bbbb","cccc"};` 这个定义创建了一个字符指针数组`s2`,包含3个元素,每个元素都是一个字符指针,分别指向字符串"aaaa"、"bbbb"和"cccc"的首字符。 4. `char s3[][3]={"aaaa","bbbb","cccc"};` 这是一种不完全类型声明,由于未指定`s3`第二维的大小,编译器会根据初始化值自动推断。这里,每个子数组长度为3,但实际存储的字符串"aaaa"、"bbbb"、"cccc"超出了3个字符,所以这会导致编译错误,因为"cccc"无法完整存储在3个字符的空间里。 5. `char s4[][4]={"aaaa","bbbb","cccc"};` 这是与`s[3][5]`等价的定义,每个子数组长度为4,可以正确存储每个字符串。虽然第一维没有指定,但由于初始化列表给出了3个元素,编译器会推断出第一维的大小为3。 总结起来,等价于初始定义`char s[3][5]={"aaaa","bbbb","cccc"}`的是`char s4[][4]={"aaaa","bbbb","cccc"}`,因为它们都能正确存储3个长度为4的字符串数组。其他定义,如`s1`和`s2`,表示的是指向字符串的指针,而不是字符数组,因此与原始定义不等价。