鱼C论坛

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

[已解决]关于数组的问题

[复制链接]
发表于 2022-9-21 12:02:58 | 显示全部楼层 |阅读模式
5鱼币
为什么都是元素首字母的地址,打印的结果却完全不同呢?

  1. #include <stdio.h>
  2. main(void)
  3. {
  4.   int a[3][4] = {1, 2, 3, 4};
  5.   printf("%d\n", *(&a[0][0] + 2));
  6.   printf("%d\n", *(&a + 2));
  7.   return 0;
  8. }
复制代码

最佳答案
2022-9-21 12:02:59
本帖最后由 桃花飞舞 于 2022-9-21 14:14 编辑
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.   int a[3][4] = {1, 2, 3, 4};
  5.   printf("%d\n", *(&a[0][0] + 2));
  6.   printf("%d\n", *(&a + 2));
  7.   return 0;
  8. }
复制代码

  printf("%d\n", *(&a[0][0] + 2));  //&a[0][0]  + 2是首元素的地址+2 也就是a[0] + 0 + 2从0号元素偏移两个元素就是3   
  printf("%d\n", *(&a + 2));     //数组名a表示数组类型的变量,a代表整个数组,&a自然指向整个数组的指针,&a是数组指针,是int(*)[3][4]类型,如果&a+2它会便宜两个二维数组
//这里的*(&a+2) 看着是指针类型但是分析下来它是数组

最佳答案

查看完整内容

printf("%d\n", *(&a[0][0] + 2)); //&a[0][0] + 2是首元素的地址+2 也就是a[0] + 0 + 2从0号元素偏移两个元素就是3 printf("%d\n", *(&a + 2)); //数组名a表示数组类型的变量,a代表整个数组,&a自然指向整个数组的指针,&a是数组指针,是int(*)[3][4]类型,如果&a+2它会便宜两个二维数组 //这里的*(&a+2) 看着是指针类型但是分析下来它是数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 12:02:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 桃花飞舞 于 2022-9-21 14:14 编辑
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.   int a[3][4] = {1, 2, 3, 4};
  5.   printf("%d\n", *(&a[0][0] + 2));
  6.   printf("%d\n", *(&a + 2));
  7.   return 0;
  8. }
复制代码

  printf("%d\n", *(&a[0][0] + 2));  //&a[0][0]  + 2是首元素的地址+2 也就是a[0] + 0 + 2从0号元素偏移两个元素就是3   
  printf("%d\n", *(&a + 2));     //数组名a表示数组类型的变量,a代表整个数组,&a自然指向整个数组的指针,&a是数组指针,是int(*)[3][4]类型,如果&a+2它会便宜两个二维数组
//这里的*(&a+2) 看着是指针类型但是分析下来它是数组

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 12:25:20 | 显示全部楼层
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.   int a[3][4] = {1, 2, 3, 4};
  5.   printf("%d\n", *(&a[0][0] + 2));
  6.   printf("%d\n", *(*a + 2));
  7.   return 0;
  8. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 12:50:43 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-9-21 13:44 编辑

。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:14:08 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-9-21 13:44 编辑

。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:33:26 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-9-21 13:36 编辑
桃花飞舞 发表于 2022-9-21 13:14
printf("%d\n", *(&a[0][0] + 2));  //&a[0][0]  + 2是首元素的地址+2 也就是a[0] + 0 + 2从 ...


你这个a[0]+0+2指向的是a[2],即二维数组a中下标为2的元素,也就是第三个一维数组的首地址,不是3哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:33:34 | 显示全部楼层
竹逸 发表于 2022-9-21 12:50
&a[0][0]取的是数组a中,第一个一维数组里的第一个元素的内存地址,+2的操作由于是地址值+2,指向的是下标 ...


你的前半句明显是错的,你去掉取值运算符*,试下看直接输出地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:37:52 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-9-21 13:40 编辑
竹逸 发表于 2022-9-21 13:33
你这个a[0]+0+2指向的是a[2],即二维数组a中下标为2的元素,也就是第三个一维数组的首地址

  1. int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
复制代码

不是啦,a[0] + 2 == &a[0][2]  是这样的就是3.
你说的是&a[0] + 2是第三个一维数组的首地址,这个才是9 你自己想想吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:40:53 From FishC Mobile | 显示全部楼层
桃花飞舞 发表于 2022-9-21 13:33
你的前半句明显是错的,你去掉取值运算符*,试下看直接输出地址

对对对,是我搞错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:49:59 From FishC Mobile | 显示全部楼层
桃花飞舞 发表于 2022-9-21 13:33
你的前半句明显是错的,你去掉取值运算符*,试下看直接输出地址

我刚刚看了下自己的笔记,笔记上写的是元素地址值,我自己记岔了,记成了元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:55:46 From FishC Mobile | 显示全部楼层
桃花飞舞 发表于 2022-9-21 13:37
不是啦,a[0] + 2 == &a[0][2]  是这样的就是3.
你说的是&a[0] +  ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 13:58:09 | 显示全部楼层
竹逸 发表于 2022-9-21 13:49
我刚刚看了下自己的笔记,笔记上写的是元素地址值,我自己记岔了,记成了元素

我是边看笔记,边用计算机运行,才没错的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-25 06:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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