sunnyrubik 发表于 2018-12-16 17:08:43

数组指针搞不懂的问题

本帖最后由 sunnyrubik 于 2018-12-16 17:28 编辑

在数组指针那一节作业里面有两个问题是
#include <stdio.h>

int main()
{
      int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      int *p = (int *)(&array + 1);//这里为什么需要强制类型转换呢?

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

      return 0;
}

#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));//这里*(p+1)是指数组的第11个元素,不是已经把值取出来了吗?为什么还要用一个*呢?为什么*(p+1)代表&array而不是array。小甲鱼视频里面那段也是翻来覆去地看没看懂(苦啊)
      return 0;
}

真的好晕啊

li_finn 发表于 2018-12-16 17:08:44

这里要区分的数组指针和数组元素的指针。
&array,是取得的整个数组array的指针,虽然它的值和数组首元素指针(&array)的值相同,但是因为数据类型不同(一个是int ,一个是int),所以它们各自代表的内存空间不同。
(&array + 1),是数组指针+1,就是说把整个array空间作为一个整体。偏移了整个array数组的大小,就是10个int。
也正是因为(&array+1)是数组指针,当要把它转换成数组元素(int)指针的时候,需要强制类型转换。

第二个例子里面,p是声明成了一个指向有10个int元素的数组的指针,是指向数组的指针,相当于对array取指针。所以,不需要类型转换。
实际上,(*p)=array,(*p)就是array。这样也许就更好理解printf里面的。*(p+1)是指向array后面的那个数组(比如取名B),类型和array一致。这样(B-6)就是指的(array+4)的位置,数据类型一致。

另外,array是非法的写法。*(array+11)是对的。

小酒酒呢 发表于 2018-12-17 20:13:28

本帖最后由 小酒酒呢 于 2018-12-17 20:15 编辑

先来回答第一个问题:为什么需要类型转换
说 int a 这个数组a是数组的首地址,也是a的地址相当于&a也就是 int * 类型当你进行 &a 的操作时实际就将其转化成了 int **类型。所以要转换。

再来回答第二个问题: int (*p) = &array;//这里为什么不需要强制类型转换呢?
先说int (*p) = &array;这句代码实际上还是对p赋值为&array   意思是p保存的就是上述的 int ** 类型   所以不需要转换

回答第三问:这里*(p+1)是指数组的第11个元素,不是已经把值取出来了吗?
接第二问, p+1是int ** 类型   *(p+1)是 int *类型    *(*(p+1))是 int类型才是数组元素

回答第四问:为什么*(p+1)代表&array而不是array。
相信 前几个问题仔细看过 本问题应该不难了。问题的本质就在于   int(*p)的解读    不能把p 和int *连在一起解读而是(*p)=array    所以 p = &array
所以**p才是array留下的问题 留给你举一反三了

回答最后一个问题:我要不要最佳?
答案 : 肯定求最佳答案呀有什么奖励统统砸过来吧



sunnyrubik 发表于 2018-12-17 22:53:53

本帖最后由 sunnyrubik 于 2018-12-17 22:58 编辑

小酒酒呢 发表于 2018-12-17 20:13
先来回答第一个问题:为什么需要类型转换
说 int a 这个数组a是数组的首地址,也是a的地址相当 ...

非常感谢你的回答哈,5鱼币送给你{:5_109:}

小酒酒呢 发表于 2018-12-18 12:25:40

sunnyrubik 发表于 2018-12-17 22:53
非常感谢你的回答哈,5鱼币送给你

感谢您对我的肯定。万事开头难,只要楼主在编程语言方面有一个愉快的开头,那么距离大牛只是时间问题。加油{:7_142:}
页: [1]
查看完整版本: 数组指针搞不懂的问题