关于数组指针的加减运算问题
下边代码将打印什么值?#include <stdio.h>
int main()
{
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p) = &array;
printf("%d\n", *(*(p+1)-6));
return 0;
}
上机测试是会打印出array的值也就是4;自己也是将*(*(p+1)-6)理解为array = array;但以下是小甲鱼的分析,我粘贴过来的:
答:4
解析:基本上一道题成功理解的话,这道题就不会有什么问题。指针 p 指向数组 array 的地址,p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置),于是 *(p+1) 即下一个数组 array 数组的起始位置,即 &array,所以 *(*(p+1)-6) == array = array。
PS:如果我把打印的代码写成这样 printf("%d\n", (*(p + 1))[-6]); 现在你应该也可以理解了吧!
小甲鱼这结果是对的,但是不是应该将*(p+1)分析为array;而不是array?????????????
定义的数组长度只有10个元素,array 是第十个元素,指向的是 array,指向的是 array 这个元素值;
而 array 实际上并不存在,小甲鱼老师为了说明问题(“p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置”))才用之,所以,按照数组的定义,array 是第5个元素,指向的是 array 这个元素值。
你将 *(*(p + 1) - 6) 理解为 array = array 错误有二:
1、*(p + 1) 已经不是程序所定义的范围
2、用一个程序定义的范围 (array)来运算程序非定义的值本身就是错误的,array = array 风过无痕1989 发表于 2021-1-16 21:19
定义的数组长度只有10个元素,array 是第十个元素,指向的是 array,指向的是 array 这个元素值 ...
能不能这句话 “定义的数组长度只有10个元素,array 是第十个元素,指向的是 array,指向的是 array 这个元素值;”加个&和*,咋么感觉我和你理解的不一样。
数组名[下标]:例如array = 0; 表示第一个元素的值,&array表示第一个元素的地址。
例如array = 8; 表示第八个元素的值,&array表示第八个元素的地址。 You-Name 发表于 2021-1-20 15:31
能不能这句话 “定义的数组长度只有10个元素,array 是第十个元素,指向的是 array,指向的是 arr ...
array = 7;写错了 数组就是一个指针,只不过这个指针是指向的位置,你要访问哪个元素指针就会加上偏移,也就是[]里的数,10个元素最多偏移就是10,一次偏移就是一个数据类型的字节 本帖最后由 风过无痕1989 于 2021-1-20 17:06 编辑
You-Name 发表于 2021-1-20 15:31
能不能这句话 “定义的数组长度只有10个元素,array 是第十个元素,指向的是 array,指向的是 arr ...
你理解的没有错!所以,就不能用 array = array
我所说的 array 是指定义,而非指数组元素
页:
[1]