鱼C论坛

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

[已解决]关于数组指针的问题

[复制链接]
发表于 2020-10-7 18:48:15 | 显示全部楼层 |阅读模式

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

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

x
我对数组指针的理解为,数组指针是一种改变了某倍数步长的指针。
所以若指针为 int (*p)[5],那p的步长为20,若指针为 int *p,则p的步长为4,虽然他们步长不同,但是他们的地址是相同的,不知道我的理解是否正确。
我用我的理解修改了一下课后题,发现一个地方有点奇怪。

                               
登录/注册后可看大图

                               
登录/注册后可看大图

不知道为什么使用数组指针的程序在输出时要多加个*才能输出和使用指针的程序相同的内容,所以我觉得我的理解可能出了问题,求大佬解答,谢谢
最佳答案
2020-10-8 16:20:45
本帖最后由 大裤衩子 于 2020-10-8 16:22 编辑

我的理解,注释中已经说明了但是不一定对,欢迎大家指正。

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char *pa[4]={"aaaaa","bbbbb","ccccc","ddddd"}; // char* (*)[4]

  5.     char** p=pa; // 指针p指向一个一级指针,即数组pa的第0个元素的地址: char** p=&pa[0];

  6.     char* (*q)[4]=&pa; /*q是指向指针数组的指针:这种用法实际上多用于二维数组中,这里q直接指向了数组pa整行
  7.     如果q+1的话直接跳过整个pa数组了,想要取得第一值,必须先加上*号,降级为列指针后在列上移动。  */


  8.     printf("%p\n", p);
  9.     printf("%d,%s\n", **(p), *p);
  10.     printf("%d,%s\n", **(p+1), *(p+1));
  11.     printf("%d,%s\n", **(p+2), *(p+2));
  12.     printf("\n\n");


  13.     printf("%p\n", q);
  14.     printf("%d,%s\n", **(*q), *(*q));  // 行指针加*降级,变列指针(虚构)
  15.     printf("%d,%s\n", **(*q+1), *(*q+1));
  16.     printf("%d,%s\n", *(*(*q+2)), *(*q+2));

  17.     printf("%d,%s\n", ***(q+1), **(q+1)); //所以这么写就是错的
  18.     return 0;
  19. }
复制代码


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

使用道具 举报

发表于 2020-10-7 23:44:16 From FishC Mobile | 显示全部楼层
pA是指针数组,p是指针数组指针
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 08:40:55 | 显示全部楼层
召唤风云 发表于 2020-10-7 23:44
pA是指针数组,p是指针数组指针

我知道呀,我疑惑的是用指向指针的指针和指针数组指针指向pA之后,为什么取出值的时候用的*的数量不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 11:03:37 From FishC Mobile | 显示全部楼层
我不知道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 16:20:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 大裤衩子 于 2020-10-8 16:22 编辑

我的理解,注释中已经说明了但是不一定对,欢迎大家指正。

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char *pa[4]={"aaaaa","bbbbb","ccccc","ddddd"}; // char* (*)[4]

  5.     char** p=pa; // 指针p指向一个一级指针,即数组pa的第0个元素的地址: char** p=&pa[0];

  6.     char* (*q)[4]=&pa; /*q是指向指针数组的指针:这种用法实际上多用于二维数组中,这里q直接指向了数组pa整行
  7.     如果q+1的话直接跳过整个pa数组了,想要取得第一值,必须先加上*号,降级为列指针后在列上移动。  */


  8.     printf("%p\n", p);
  9.     printf("%d,%s\n", **(p), *p);
  10.     printf("%d,%s\n", **(p+1), *(p+1));
  11.     printf("%d,%s\n", **(p+2), *(p+2));
  12.     printf("\n\n");


  13.     printf("%p\n", q);
  14.     printf("%d,%s\n", **(*q), *(*q));  // 行指针加*降级,变列指针(虚构)
  15.     printf("%d,%s\n", **(*q+1), *(*q+1));
  16.     printf("%d,%s\n", *(*(*q+2)), *(*q+2));

  17.     printf("%d,%s\n", ***(q+1), **(q+1)); //所以这么写就是错的
  18.     return 0;
  19. }
复制代码


x.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 18:07:15 | 显示全部楼层
p是数组指针,不是指针数组
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-9 09:04:29 | 显示全部楼层
大裤衩子 发表于 2020-10-8 16:20
我的理解,注释中已经说明了但是不一定对,欢迎大家指正。

谢谢你,大概懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-9 09:05:06 | 显示全部楼层
萌出血 发表于 2020-10-8 18:07
p是数组指针,不是指针数组

感谢指正,笔误了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 16:21:55 | 显示全部楼层
被绕迷了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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