鱼C论坛

 找回密码
 立即注册
查看: 1035|回复: 4

[已解决]关于C的指针与数组

[复制链接]
发表于 2023-9-9 21:46:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有个问题不太理解 不知道有没有同志可以帮忙解答一下
运用的DEVC
一维数组
int a[3] = {1,2,3};
int *pa = &a;  //这里直接int *p = a 会报错
二维宿主
int b[][3] = {1,2,3,4,5,6};
int *pb = b;   //这里用了 int *pb = &b 会报错
这是为什么呢?
一维数组的数组名和数组地址 和  数组第一个元素地址不是相同吗 按照正规写法的确是应该  int *pa=&a; 但为何会报错?
而二维数组为何是用了&b 反而会报错
不是很理解希望有人能够解惑答疑 谢谢!
最佳答案
2023-9-9 21:46:11
对于第一个问题,int *pa = &a; 会报错是因为&a是数组a的地址,类型为int (*)[3],而pa是一个指向int类型的指针,类型为int *,二者类型不匹配。应该将pa的类型改为int (*)[3],即指向整个数组的指针,正确写法为:int (*pa)[3] = &a;。

对于第二个问题,int *pb = b; 会报错是因为b是一个二维数组,它的类型是int [][3],而pb是一个指向int类型的指针,类型为int *,二者类型不匹配。应该将pb的类型改为int (*)[3],即指向整个二维数组的指针,正确写法为:int (*pb)[3] = b;。

在C语言中,数组名表示数组首元素的地址,而二维数组名表示二维数组第一行的地址。因此,对于一维数组a,&a表示整个数组的地址,类型为int (*)[3];而对于二维数组b,&b表示整个二维数组的地址,类型为int (*)[][3]。因此,当我们想要定义一个指向整个数组或整个二维数组的指针时,需要使用对应的类型来声明指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-9 21:46:11 | 显示全部楼层    本楼为最佳答案   
对于第一个问题,int *pa = &a; 会报错是因为&a是数组a的地址,类型为int (*)[3],而pa是一个指向int类型的指针,类型为int *,二者类型不匹配。应该将pa的类型改为int (*)[3],即指向整个数组的指针,正确写法为:int (*pa)[3] = &a;。

对于第二个问题,int *pb = b; 会报错是因为b是一个二维数组,它的类型是int [][3],而pb是一个指向int类型的指针,类型为int *,二者类型不匹配。应该将pb的类型改为int (*)[3],即指向整个二维数组的指针,正确写法为:int (*pb)[3] = b;。

在C语言中,数组名表示数组首元素的地址,而二维数组名表示二维数组第一行的地址。因此,对于一维数组a,&a表示整个数组的地址,类型为int (*)[3];而对于二维数组b,&b表示整个二维数组的地址,类型为int (*)[][3]。因此,当我们想要定义一个指向整个数组或整个二维数组的指针时,需要使用对应的类型来声明指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-9 21:46:23 | 显示全部楼层
你的问题涉及 C 语言中指针和数组的一些概念。

首先,关于一维数组的问题:

1. 初始化一维数组:int a[3] = {1, 2, 3};
   这条语句正确地创建了一个含有三个整数元素的一维数组,并将每个元素的值初始化为 1、2 和 3。

2. 定义指向一维数组的指针:int *pa = &a;
   这里编译器会报错,因为数组名 a 本身就代表数组的首地址,类型为 int*。因此,正确的写法应该是 int *pa = a;,不需要使用取地址运算符 &

接下来,关于二维数组的问题:

1. 初始化二维数组:int b[][3] = {1, 2, 3, 4, 5, 6};
   这条语句创建了一个二维数组,其中包含两行三列的整数元素,依次初始化为 1、2、3 和 4、5、6。

2. 定义指向二维数组的指针:int *pb = &b;
   这里也会报错,因为二维数组名 b 也代表着数组的首地址,类型为 int (*)[3](指向含有三个整数的一维数组)。因此,正确的写法应该是 int (*pb)[3] = b;

总结一下:

· 对于一维数组来说,数组名代表数组的首地址,可以直接赋值给相应类型的指针,不需要取地址运算符 &
· 对于二维数组来说,数组名同样代表着数组的首地址,但由于其类型是指向一维数组的指针(即 int (*)[3]),所以在定义指向二维数组的指针时需要使用括号来保证优先级。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 08:26:32 | 显示全部楼层
在C语言中,数组名是一个指向数组首元素的常量指针。所以对于一维数组 `a`,表达式 `int *pa = a;` 是合法的,因为 `a` 即代表了数组首元素的地址。

然而,如果直接使用 `int *pa = &a;`,则是错误的写法。因为 `&a` 表示的是整个数组的地址,类型为指向一维数组的指针,而不是指向数组首元素的指针。因此,类型不匹配会导致编译错误。

对于二维数组 `b`,情况稍有不同。二维数组实际上是由多个一维数组按顺序排列而成的,每个一维数组都有自己的首元素地址。定义 `int b[][3]` 表示一个二维数组,其中每个一维数组有3个元素。

表达式 `int *pb = b;` 是合法的,因为 `b` 是一个指针,指向二维数组的首元素,而二维数组的首元素即是第一个一维数组的地址。所以 `pb` 可以指向第一个一维数组的首元素。

然而,使用 `int *pb = &b;` 是错误的写法。因为 `&b` 表示的是整个二维数组的地址,类型为指向二维数组的指针,而不是指向第一个一维数组的指针。因此,类型不匹配会导致编译错误。

总结起来:

- 一维数组名代表数组首元素的地址,可以直接赋值给指针变量。
- 二维数组名表示整个二维数组的地址,不能直接赋值给指针变量,但可以通过省略第一个维度的方式隐式地指向第一个一维数组的首元素。

希望能够解答你的疑惑!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-11 10:43:09 | 显示全部楼层
谢谢大家的解答了 似乎明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 12:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表