小帅才1 发表于 2023-2-26 22:46:22

C语言指针数组问题

我又又又来问问题啦?是一个指针数组的问题
具体代码如下:
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指向b数组,parr ==*(parr+1),这样的话,parr+1应该是走16个字节,8字节这个也不对,整的我现在有点迷糊

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

ba21 发表于 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);

小帅才1 发表于 2023-3-1 08:50:18

在老哥的提点下确实发现了一些错误
首先先说错误:
1.指针的步长是针对指针而言,应该看的是parr和(parr+1),且地址之间的输出为16进制,经过验证,确实是8字节(电脑为64位)
2.parr = *(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,但是走的字节数不同
页: [1]
查看完整版本: C语言指针数组问题