鱼C论坛

 找回密码
 立即注册
查看: 3104|回复: 4

[已解决]数组指针搞不懂的问题

[复制链接]
发表于 2018-12-16 17:08:43 | 显示全部楼层 |阅读模式
3鱼币
本帖最后由 sunnyrubik 于 2018-12-16 17:28 编辑

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

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

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

  7.         return 0;
  8. }
复制代码

  1. #include <stdio.h>

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

  6.         printf("%d\n", *(*(p+1)-6));//这里*(p+1)是指数组的第11个元素,不是已经把值取出来了吗?为什么还要用一个*呢?为什么*(p+1)代表&array[11]而不是array[11]。小甲鱼视频里面那段也是翻来覆去地看没看懂(苦啊)
  7.         return 0;
  8. }
复制代码


真的好晕啊
最佳答案
2018-12-16 17:08:44
这里要区分的数组指针和数组元素的指针。
&array,是取得的整个数组array[10]的指针,虽然它的值和数组首元素指针(&array[0])的值相同,但是因为数据类型不同(一个是int [10],一个是int),所以它们各自代表的内存空间不同。
(&array + 1),是数组指针+1,就是说把整个array[10]空间作为一个整体。偏移了整个array[10]数组的大小,就是10个int。
也正是因为(&array+1)是数组指针,当要把它转换成数组元素(int)指针的时候,需要强制类型转换。

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

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

最佳答案

查看完整内容

这里要区分的数组指针和数组元素的指针。 &array,是取得的整个数组array[10]的指针,虽然它的值和数组首元素指针(&array[0])的值相同,但是因为数据类型不同(一个是int [10],一个是int),所以它们各自代表的内存空间不同。 (&array + 1),是数组指针+1,就是说把整个array[10]空间作为一个整体。偏移了整个array[10]数组的大小,就是10个int。 也正是因为(&array+1)是数组指针,当要把它转换成数组元素(int)指针的时候, ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-16 17:08:44 | 显示全部楼层    本楼为最佳答案   
这里要区分的数组指针和数组元素的指针。
&array,是取得的整个数组array[10]的指针,虽然它的值和数组首元素指针(&array[0])的值相同,但是因为数据类型不同(一个是int [10],一个是int),所以它们各自代表的内存空间不同。
(&array + 1),是数组指针+1,就是说把整个array[10]空间作为一个整体。偏移了整个array[10]数组的大小,就是10个int。
也正是因为(&array+1)是数组指针,当要把它转换成数组元素(int)指针的时候,需要强制类型转换。

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

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
sunnyrubik + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-17 20:13:28 | 显示全部楼层
本帖最后由 小酒酒呢 于 2018-12-17 20:15 编辑

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

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

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

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

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



评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
sunnyrubik + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-17 22:53:53 | 显示全部楼层
本帖最后由 sunnyrubik 于 2018-12-17 22:58 编辑
小酒酒呢 发表于 2018-12-17 20:13
先来回答第一个问题:为什么需要类型转换
说 int a[10] 这个数组  a是数组的首地址,也是a[0]的地址  相当 ...


非常感谢你的回答哈,5鱼币送给你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-18 12:25:40 | 显示全部楼层
sunnyrubik 发表于 2018-12-17 22:53
非常感谢你的回答哈,5鱼币送给你

感谢您对我的肯定。万事开头难,只要楼主在编程语言方面有一个愉快的开头,那么距离大牛只是时间问题。加油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 07:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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