鱼C论坛

 找回密码
 立即注册
查看: 2034|回复: 2

C语言指针数组问题

[复制链接]
发表于 2023-2-26 22:46:22 | 显示全部楼层 |阅读模式

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

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

x
我又又又来问问题啦?是一个指针数组的问题
具体代码如下:
int main(void){
    int a[] = {0, 1, 2, 9};
    int b[] = {3, 4, 5};
    int c[] = {6, 7, 8};

    int * parr[] = {a, b, c};

    printf("%p\n", *parr);
    printf("%p\n", *(parr+1));

    return 0;
}

问题是:
1.parr是一个指针数组,parr的类型是int *, 之前看视频说,指针变量前的类型决定了指针走一步走多远,我的电脑是64位的,应该走8字节,但是现在却只走了6字节

2.parr[1]指向b数组,parr[1] ==*(parr+1),这样的话,parr+1应该是走16个字节,8字节这个也不对,整的我现在有点迷糊

所以想请教一下大家,麻烦大家给我解答一下,谢谢啦!

指针数组的问题

指针数组的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-26 22:58:56 | 显示全部楼层
去看看它们的区别
        printf("%p\n", &a);
        printf("%p\n", &b);
        printf("\n");

        printf("%p\n", *parr);
        printf("%p\n", *(parr+1));
        printf("\n");

        printf("%p\n", parr);
        printf("%p\n", parr+1);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-1 08:50:18 | 显示全部楼层
在老哥的提点下确实发现了一些错误
首先先说错误:
1.指针的步长是针对指针而言,应该看的是parr和(parr+1),且地址之间的输出为16进制,经过验证,确实是8字节(电脑为64位)
2.parr[1] = *(parr+1)没有问题,(parr+1)被解引用之后,得到的是数组b的地址,而数组a,b,c是由操作系统自行分配在栈区,分配的地址可能并不相邻
3.如果想要以指针的形式取出b数组中第二个元素,可以表示为 *(*(parr+1)+1)
m=*(parr+1)表示b的地址,这里+1看的是指针数组的类型,是int*类型,所以走了8字节
*(m+1)表示b中元素,这里的+1是在b数组中,指针的类型是int类型,所以走了4字节,找到的是6
两个都+1,但是走的字节数不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 19:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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