鱼C论坛

 找回密码
 立即注册
查看: 955|回复: 8

[已解决]数组指针

[复制链接]
发表于 2020-12-14 01:59:34 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼课后作业;
  p指针变量指向整个数组,
*(*(p+1)-6)
这里两个*什么意思呀
一直没搞懂,大佬帮帮我





#include <stdio.h>

int main()
{
        int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int (*p)[10] = &array;

        printf("%d\n", *(*(p+1)-6));

        return 0;
}
最佳答案
2020-12-14 11:57:52
万千只cnm 发表于 2020-12-14 11:08
“p + i  (注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行”
这句话什 ...

int (*p)[4] = a;

1) p 指向数组 a 的开头,也即第 0 行;p + 1 前进一行,指向第 1 行。

2) *(p + 1) 表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素。

3) *(p + 1) + 1 表示第 1 行第 1 个元素的地址。如何理解呢?

*(p + 1) 单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;

4) *(*(p + 1) + 1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

5) 上面的明白了,我们再来看对于第 i 行第 j 列,即 a[ i ][ j ] 列的表示就可以写成:*(p + i) + j,要取这个单元的元素值,就再在前面加一个 * 号:*(*(p + i) + j)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-14 09:01:34 | 显示全部楼层
两次间访,第一次将  行指针  转化成  列指针,再将 列指针 表达出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 09:13:15 | 显示全部楼层
你这个指针定义有问题,越界了,所以才用 -6 将指针拉回来。

(*p)[10] 这样的定义,一般是针对二维数组而言,表明它拥有10个元素,p + i  (注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行,换句话说,就是将第 i 行的首地址赋给指针,*(p + i)  + j 就是指针指向了第 i 行的第 j 个元素,然后外面再用一个 * 表示取 *(p + i)  + j 这个地址的元素值,即 *(*(p + i)  + j )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 11:04:08 | 显示全部楼层
2302855560 发表于 2020-12-14 09:01
两次间访,第一次将  行指针  转化成  列指针,再将 列指针 表达出来

不是线性的嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 11:08:15 | 显示全部楼层
风过无痕1989 发表于 2020-12-14 09:13
你这个指针定义有问题,越界了,所以才用 -6 将指针拉回来。

(*p)[10] 这样的定义,一般是针对二维数组 ...

“p + i  (注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行”
这句话什么意思呀,没搞明白,
*取址取的是什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 11:57:52 | 显示全部楼层    本楼为最佳答案   
万千只cnm 发表于 2020-12-14 11:08
“p + i  (注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行”
这句话什 ...

int (*p)[4] = a;

1) p 指向数组 a 的开头,也即第 0 行;p + 1 前进一行,指向第 1 行。

2) *(p + 1) 表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素。

3) *(p + 1) + 1 表示第 1 行第 1 个元素的地址。如何理解呢?

*(p + 1) 单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;

4) *(*(p + 1) + 1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

5) 上面的明白了,我们再来看对于第 i 行第 j 列,即 a[ i ][ j ] 列的表示就可以写成:*(p + i) + j,要取这个单元的元素值,就再在前面加一个 * 号:*(*(p + i) + j)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 13:15:43 | 显示全部楼层
风过无痕1989 发表于 2020-12-14 11:57
int (*p)[4] = a;

1) p 指向数组 a 的开头,也即第 0 行;p + 1 前进一行,指向第 1 行。

哦哦 谢谢
那是不是p也可以换成数组名
--》a[I][j]==*(*(a+i)+j)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 13:56:48 | 显示全部楼层
万千只cnm 发表于 2020-12-14 13:15
哦哦 谢谢
那是不是p也可以换成数组名
--》a[j]==*(*(a+i)+j)

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

使用道具 举报

 楼主| 发表于 2020-12-14 14:19:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 09:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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