鱼C论坛

 找回密码
 立即注册
查看: 1881|回复: 11

[已解决]指针与二维数组学习中的一个疑惑

[复制链接]
发表于 2022-9-9 17:56:41 | 显示全部楼层 |阅读模式

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

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

x
int array [][3]={1,2,3,4,5,6,7,8,9}
    0   1   2
0  1   2   3
1 4   5   6
2  7   8   9

array + 1 和 *(array+1)一样吗?
它们都表示二维数组第二行第一个元素的地址。
最佳答案
2022-9-9 18:06:27
不一样,数组的名字是数组第0个元素的地址
array 就是 &array[0]

array + 1 就是 &array[0] + 1
*(array + 1) 就是 *(&array[0] + 1)

请问 &array[0] + 1 和 *(&array[0] + 1) 一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-9 18:06:27 | 显示全部楼层    本楼为最佳答案   
不一样,数组的名字是数组第0个元素的地址
array 就是 &array[0]

array + 1 就是 &array[0] + 1
*(array + 1) 就是 *(&array[0] + 1)

请问 &array[0] + 1 和 *(&array[0] + 1) 一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-9 18:08:17 | 显示全部楼层
很明显不一样么
第2个在第1个的基础上又进行了1次解引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-9 18:11:59 | 显示全部楼层
人造人 发表于 2022-9-9 18:08
很明显不一样么
第2个在第1个的基础上又进行了1次解引用

但是第二个在二维数组里也表示第二行第一个元素的首地址呀
二维数组里*(*(array + 1) + 1) 表示第二行第二列元素
而加粗部分表示的是第二行首元素的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-9 18:24:32 | 显示全部楼层
水边的小姑娘 发表于 2022-9-9 18:11
但是第二个在二维数组里也表示第二行第一个元素的首地址呀
二维数组里*(*(array + 1) + 1) 表示第二行第 ...

什么?

*(&array[0] + 1)
&array[0] 是数组第0个元素的地址
&array[0] + 1 就是数组第1个元素的地址
*(&array[0] + 1) 就是数组第1个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-9 18:25:59 | 显示全部楼层
稍等,上面的不对,我在给你重写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-9 19:04:57 | 显示全部楼层
int array [][3]={1,2,3,4,5,6,7,8,9};
C语言中不存在所谓的二维数组,三维数组,四维数组,。。。
C语言中只有数组中的数组,就是在数组中存储数组
int array [3][3]={1,2,3,4,5,6,7,8,9};
array是一个数组,有3个元素,每一个元素都是一个数组
array是一个数组,array[0] 也是一个数组
同样 array[1] 和 array[2] 也是数组
array[0] 这个数组有3个元素,每一个元素都是一个int
array[0] 的元素是 {1, 2, 3}
array[1] 的元素是 {4, 5, 6}
array[2] 的元素是 {7, 8, 9}

其实这个
int array [3][3]={1,2,3,4,5,6,7,8,9};
写成下面这样更好,更能体现数组中的数组
    int array[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

array 是数组第0个元素的地址
&array    是数组的地址

array + 1 就是 &array[0] + 1
array[0] 是一个数组,&array[0]  就是 array[0] 这个数组的地址
&array[0] + 1 就成了 数组 array[1] 的地址,就是 &array[1]

*(array + 1) 就是 *&array[1]
*&array[1] 也就是 array[1]
array[1] 是一个数组,元素是 {4, 5, 6}
array[1] 是一个数组,就可以理解成数组的名字
array[1] 就是 &array[1][0]
数组的名字是数组第0个元素的地址
数组名  ==    &数组名[0]

array[1] == 数组名
&    array[1]      [0]
就是把数组名字的前面加上一个 &
后面加上一个 [0]

&array[1][0]
就是 array[1] 这个数组第0个元素的地址


写了这么多,不知道你能不能看懂
其实很简单,你就把多维数组看成是在数组里面存储数组
array 是一个数组
array[0] 也是一个数组,是array这个数组第0个元素
array 是数组的名字
因为array这个数组的第0个元素是一个数组,array[0] 也是数组的名字

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-9 19:07:13 | 显示全部楼层
数组的地址和数组第0个元素的地址是不一样的
 #include <stdio.h>

int main() {
    int array[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    printf("%p\n", array + 1);
    printf("%p\n", *(array + 1));
    printf("%p\n", (array + 1) + 1);
    printf("%p\n", (*(array + 1)) + 1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-9 19:50:39 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-9-9 19:07
数组的地址和数组第0个元素的地址是不一样的

谢谢,谢谢抱歉这么晚回,还在上课,等会回去了我运行一下试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-9 19:51:50 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-9-9 19:04
C语言中不存在所谓的二维数组,三维数组,四维数组,。。。
C语言中只有数组中的数组,就是在数组中存储 ...

我能理解它们是不一样的了,但是它们能达到相同的效果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-9 20:01:47 | 显示全部楼层
水边的小姑娘 发表于 2022-9-9 19:51
我能理解它们是不一样的了,但是它们能达到相同的效果?
 #include <stdio.h>

int main() {
    int array[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    printf("%p\n", array + 1);
    printf("%p\n", *(array + 1));
    printf("%p\n", (array + 1) + 1);
    printf("%p\n", (*(array + 1)) + 1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-9-9 21:16:41 | 显示全部楼层

嗯嗯,它们的效果的确是一样的
^_^.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 16:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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