C语言指针问题求解……

csy0526 2015-10-18 06:57:40
最近在学习指针,被那些指向来指向去的东西弄的好晕……

1、如果定义一个数组int a[n],并拿数组名作为一个函数的参数进行传递的话,形参的形式可以写成int *a
那么定义一个二维数组int a[n][m],还是拿数组名作为一个函数的参数进行传递,为什么形参的形式不能写成int **a呢?

2、定义一个指向数组的指针int (*p)[4];
如果想要初始化这个指针的话,应该是要把另一个包含四个元素的数组的地址赋给p
比如我写成下面这个样子
int a[4];
int (*p)[4];
下面是疑问:
a本来就是指向数组头元素的指针了,为什么初始化语句的形式不能写成p=a,而必须写成&a呢?
a是指向数组头元素的指针,那&a代表的是什么含义呢?指向数组头元素地址的指针?感觉这好像没什么实际含义似的啊……

3、如果我定义一个函数的形参形式是int **a,那么作为一个实参应该以一种什么类型来进行传递呢?除了同样定义一个双重指针进行传递以外

望各位大神能不吝赐教,谢谢!
...全文
107 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
csy0526 2015-10-18
  • 打赏
  • 举报
回复
引用 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] 谢谢!你的解答让我获益良多!
fefe82 2015-10-18
  • 打赏
  • 举报
回复
引用 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 语言来说,这句话在任何场合都不成立。 这句话带来了很多对数组的误解。
csy0526 2015-10-18
  • 打赏
  • 举报
回复
引用 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语言的书和视频里面是这么讲的,数组名里面存放的是数组第一个元素的地址。 换句话说,就是数组名是指向数组第一个元素的指针。 结合你前面的解释来看,应该说这句话并不是在所有场合下都成立的吧?
汇编菌 2015-10-18
  • 打赏
  • 举报
回复
up dd
fefe82 2015-10-18
  • 打赏
  • 举报
回复
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];

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧