user-0 提问: C语言指针问题求解……

回复:
user: user-0
content: 引用 4 楼 fefe82 的回复:[quote=引用 3 楼 csy0526 的回复:] [quote=引用 1 楼 fefe82 的回复:] 1. C 语言中所谓的“二维数组”，实际上是数组的数组。（“二维数组”这个叫法在这里非常误导人，“二维指针”也是一样）。   C 语言中所谓的“二维指针”，实际上是指向指针的指针。     int a[10]; 是“含有10个(int)元素的数组”，它可以被转化为“指向(int)的指针”    int a[10][20]; 是“含有10个(含有20个int元素的数组)元素的数组” （数组的数组），它可以被转化为“指向(含有20个int元素的数组)的指针" （数组的指针）。它不能被转化为int** ("指向(指向int的指针)的指针”)。  2. a 是数组，不是“指向数组头元素的指针”。a 出现在表达式中时，多数情况下会被自动转化为“指向数组头元素的指针”。    比如，在 p = a 中，a 会被转化为“指向数组头元素的指针”。然而此时 p 是“指向(含有4个int元素的数组)的指针”，两者类型不匹配。   &a 是一个 a 不会被转化的情况，此时 a 还是数组，对数组取地址，得到指向数组的指针（“指向(含有4个int元素的数组)的指针”）。p=&a 两者类型才匹配。    (顺带说一下，还有一种不会转化的情况是 sizeof(a))。  3. 这里你可以传一个指针数组。int *p[4];  非常感谢你的答复！ 确实，你在第二点中提到a是数组的时候，很多我无法理解的东西就能解释通了，豁然开朗啊！ 只是关于这点，还有一个小问题： 在我看过的一些C语言的书和视频里面是这么讲的，数组名里面存放的是数组第一个元素的地址。 换句话说，就是数组名是指向数组第一个元素的指针。 结合你前面的解释来看，应该说这句话并不是在所有场合下都成立的吧？[/quote]  “数组名里面存放的是数组第一个元素的地址” “换句话说，就是数组名是指向数组第一个元素的指针。” 我的个人觉得，对现在的 C 语言来说，这句话在任何场合都不成立。  这句话带来了很多对数组的误解。[/quote]  谢谢！你的解答让我获益良多！

user: user-1
content: 引用 3 楼 csy0526 的回复:[quote=引用 1 楼 fefe82 的回复:] 1. C 语言中所谓的“二维数组”，实际上是数组的数组。（“二维数组”这个叫法在这里非常误导人，“二维指针”也是一样）。   C 语言中所谓的“二维指针”，实际上是指向指针的指针。     int a[10]; 是“含有10个(int)元素的数组”，它可以被转化为“指向(int)的指针”    int a[10][20]; 是“含有10个(含有20个int元素的数组)元素的数组” （数组的数组），它可以被转化为“指向(含有20个int元素的数组)的指针" （数组的指针）。它不能被转化为int** ("指向(指向int的指针)的指针”)。  2. a 是数组，不是“指向数组头元素的指针”。a 出现在表达式中时，多数情况下会被自动转化为“指向数组头元素的指针”。    比如，在 p = a 中，a 会被转化为“指向数组头元素的指针”。然而此时 p 是“指向(含有4个int元素的数组)的指针”，两者类型不匹配。   &a 是一个 a 不会被转化的情况，此时 a 还是数组，对数组取地址，得到指向数组的指针（“指向(含有4个int元素的数组)的指针”）。p=&a 两者类型才匹配。    (顺带说一下，还有一种不会转化的情况是 sizeof(a))。  3. 这里你可以传一个指针数组。int *p[4];  非常感谢你的答复！ 确实，你在第二点中提到a是数组的时候，很多我无法理解的东西就能解释通了，豁然开朗啊！ 只是关于这点，还有一个小问题： 在我看过的一些C语言的书和视频里面是这么讲的，数组名里面存放的是数组第一个元素的地址。 换句话说，就是数组名是指向数组第一个元素的指针。 结合你前面的解释来看，应该说这句话并不是在所有场合下都成立的吧？[/quote]  “数组名里面存放的是数组第一个元素的地址” “换句话说，就是数组名是指向数组第一个元素的指针。” 我的个人觉得，对现在的 C 语言来说，这句话在任何场合都不成立。  这句话带来了很多对数组的误解。

user: user-0
content: 引用 1 楼 fefe82 的回复:1. C 语言中所谓的“二维数组”，实际上是数组的数组。（“二维数组”这个叫法在这里非常误导人，“二维指针”也是一样）。   C 语言中所谓的“二维指针”，实际上是指向指针的指针。     int a[10]; 是“含有10个(int)元素的数组”，它可以被转化为“指向(int)的指针”    int a[10][20]; 是“含有10个(含有20个int元素的数组)元素的数组” （数组的数组），它可以被转化为“指向(含有20个int元素的数组)的指针" （数组的指针）。它不能被转化为int** ("指向(指向int的指针)的指针”)。  2. a 是数组，不是“指向数组头元素的指针”。a 出现在表达式中时，多数情况下会被自动转化为“指向数组头元素的指针”。    比如，在 p = a 中，a 会被转化为“指向数组头元素的指针”。然而此时 p 是“指向(含有4个int元素的数组)的指针”，两者类型不匹配。   &a 是一个 a 不会被转化的情况，此时 a 还是数组，对数组取地址，得到指向数组的指针（“指向(含有4个int元素的数组)的指针”）。p=&a 两者类型才匹配。    (顺带说一下，还有一种不会转化的情况是 sizeof(a))。  3. 这里你可以传一个指针数组。int *p[4];  非常感谢你的答复！ 确实，你在第二点中提到a是数组的时候，很多我无法理解的东西就能解释通了，豁然开朗啊！ 只是关于这点，还有一个小问题： 在我看过的一些C语言的书和视频里面是这么讲的，数组名里面存放的是数组第一个元素的地址。 换句话说，就是数组名是指向数组第一个元素的指针。 结合你前面的解释来看，应该说这句话并不是在所有场合下都成立的吧？

user: user-2
content: up      dd

user: user-1
content: 1. C 语言中所谓的“二维数组”，实际上是数组的数组。（“二维数组”这个叫法在这里非常误导人，“二维指针”也是一样）。   C 语言中所谓的“二维指针”，实际上是指向指针的指针。     int a[10]; 是“含有10个(int)元素的数组”，它可以被转化为“指向(int)的指针”    int a[10][20]; 是“含有10个(含有20个int元素的数组)元素的数组” （数组的数组），它可以被转化为“指向(含有20个int元素的数组)的指针" （数组的指针）。它不能被转化为int** ("指向(指向int的指针)的指针”)。  2. a 是数组，不是“指向数组头元素的指针”。a 出现在表达式中时，多数情况下会被自动转化为“指向数组头元素的指针”。    比如，在 p = a 中，a 会被转化为“指向数组头元素的指针”。然而此时 p 是“指向(含有4个int元素的数组)的指针”，两者类型不匹配。   &a 是一个 a 不会被转化的情况，此时 a 还是数组，对数组取地址，得到指向数组的指针（“指向(含有4个int元素的数组)的指针”）。p=&a 两者类型才匹配。    (顺带说一下，还有一种不会转化的情况是 sizeof(a))。  3. 这里你可以传一个指针数组。int *p[4];