鱼C论坛

 找回密码
 立即注册
查看: 1171|回复: 5

[已解决]关于数组指针的加减运算问题

[复制链接]
发表于 2021-1-16 18:50:42 | 显示全部楼层 |阅读模式

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

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

x
下边代码将打印什么值?

#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;
}

上机测试是会打印出array[4]的值也就是4;自己也是将*(*(p+1)-6)理解为array[10-6] = array[4];但以下是小甲鱼的分析,我粘贴过来的:

答:4

解析:基本上一道题成功理解的话,这道题就不会有什么问题。指针 p 指向数组 array 的地址,p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置),于是 *(p+1) 即下一个数组 array 数组的起始位置,即 &array[11],所以 *(*(p+1)-6) == array[11 - 6] = array[5]。

PS:如果我把打印的代码写成这样 printf("%d\n", (*(p + 1))[-6]); 现在你应该也可以理解了吧!



小甲鱼这结果是对的,但是不是应该将*(p+1)分析为array[10];而不是array[11]?????????????

最佳答案
2021-1-16 21:19:57
定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 array[9] 这个元素值;
而 array[11] 实际上并不存在,小甲鱼老师为了说明问题(“p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置”))才用之,所以,按照数组的定义,array[5] 是第5个元素,指向的是 array[4] 这个元素值。

你将 *(*(p + 1) - 6) 理解为 array[10 - 6] = array[4] 错误有二:
1、*(p + 1) 已经不是程序所定义的范围
2、用一个程序定义的范围 (array[10])来运算程序非定义的值本身就是错误的,array[10 - 6] = array[4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-16 21:19:57 | 显示全部楼层    本楼为最佳答案   
定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 array[9] 这个元素值;
而 array[11] 实际上并不存在,小甲鱼老师为了说明问题(“p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置”))才用之,所以,按照数组的定义,array[5] 是第5个元素,指向的是 array[4] 这个元素值。

你将 *(*(p + 1) - 6) 理解为 array[10 - 6] = array[4] 错误有二:
1、*(p + 1) 已经不是程序所定义的范围
2、用一个程序定义的范围 (array[10])来运算程序非定义的值本身就是错误的,array[10 - 6] = array[4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 15:31:25 | 显示全部楼层
风过无痕1989 发表于 2021-1-16 21:19
定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 array[9] 这个元素值 ...

能不能这句话 “定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 array[9] 这个元素值;”加个&和*,咋么感觉我和你理解的不一样。

数组名[下标]:例如array[0] = 0; 表示第一个元素的值,  &array[0]表示第一个元素的地址。
                      例如array[7] = 8; 表示第八个元素的值,  &array[7]表示第八个元素的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 15:32:16 | 显示全部楼层
You-Name 发表于 2021-1-20 15:31
能不能这句话 “定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 arr ...

array[7] = 7;写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-20 16:33:56 | 显示全部楼层
数组就是一个指针,只不过这个指针是指向[0]的位置,你要访问哪个元素指针就会加上偏移,也就是[]里的数,10个元素最多偏移就是10,一次偏移就是一个数据类型的字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-20 17:04:56 | 显示全部楼层
本帖最后由 风过无痕1989 于 2021-1-20 17:06 编辑
You-Name 发表于 2021-1-20 15:31
能不能这句话 “定义的数组长度只有10个元素,array[10] 是第十个元素,指向的是 array[9],指向的是 arr ...


你理解的没有错!所以,就不能用 array[10 - 6] = array[4]

我所说的 array[10] 是指定义,而非指数组元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 07:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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