鱼C论坛

 找回密码
 立即注册
查看: 1097|回复: 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 编辑

我的理解,注释中已经说明了但是不一定对,欢迎大家指正。
#include <stdio.h>

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

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

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


    printf("%p\n", p);
    printf("%d,%s\n", **(p), *p); 
    printf("%d,%s\n", **(p+1), *(p+1));
    printf("%d,%s\n", **(p+2), *(p+2));
    printf("\n\n");


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

    printf("%d,%s\n", ***(q+1), **(q+1)); //所以这么写就是错的
    return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-7 23:44:16 From FishC Mobile | 显示全部楼层
pA是指针数组,p是指针数组指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我知道呀,我疑惑的是用指向指针的指针和指针数组指针指向pA之后,为什么取出值的时候用的*的数量不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 11:03:37 From FishC Mobile | 显示全部楼层
我不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的理解,注释中已经说明了但是不一定对,欢迎大家指正。
#include <stdio.h>

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

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

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


    printf("%p\n", p);
    printf("%d,%s\n", **(p), *p); 
    printf("%d,%s\n", **(p+1), *(p+1));
    printf("%d,%s\n", **(p+2), *(p+2));
    printf("\n\n");


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

    printf("%d,%s\n", ***(q+1), **(q+1)); //所以这么写就是错的
    return 0;
}

x.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 18:07:15 | 显示全部楼层
p是数组指针,不是指针数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢你,大概懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢指正,笔误了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 16:21:55 | 显示全部楼层
被绕迷了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 23:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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