w714889464@qq.c 发表于 2020-10-7 18:48:15

关于数组指针的问题

我对数组指针的理解为,数组指针是一种改变了某倍数步长的指针。
所以若指针为 int (*p),那p的步长为20,若指针为 int *p,则p的步长为4,虽然他们步长不同,但是他们的地址是相同的,不知道我的理解是否正确。
我用我的理解修改了一下课后题,发现一个地方有点奇怪。
http://chuantu.xyz/t6/741/1602067550x989499252.pnghttp://chuantu.xyz/t6/741/1602067594x989559068.png
不知道为什么使用数组指针的程序在输出时要多加个*才能输出和使用指针的程序相同的内容,所以我觉得我的理解可能出了问题,求大佬解答,谢谢

召唤风云 发表于 2020-10-7 23:44:16

pA是指针数组,p是指针数组指针

w714889464@qq.c 发表于 2020-10-8 08:40:55

召唤风云 发表于 2020-10-7 23:44
pA是指针数组,p是指针数组指针

我知道呀,我疑惑的是用指向指针的指针和指针数组指针指向pA之后,为什么取出值的时候用的*的数量不同

召唤风云 发表于 2020-10-8 11:03:37

我不知道

大裤衩子 发表于 2020-10-8 16:20:45

本帖最后由 大裤衩子 于 2020-10-8 16:22 编辑

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

#include <stdio.h>

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

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

    char* (*q)=&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;
}


萌出血 发表于 2020-10-8 18:07:15

p是数组指针,不是指针数组

w714889464@qq.c 发表于 2020-10-9 09:04:29

大裤衩子 发表于 2020-10-8 16:20
我的理解,注释中已经说明了但是不一定对,欢迎大家指正。

谢谢你,大概懂了

w714889464@qq.c 发表于 2020-10-9 09:05:06

萌出血 发表于 2020-10-8 18:07
p是数组指针,不是指针数组

感谢指正,笔误了

心驰神往 发表于 2020-10-9 16:21:55

被绕迷了
页: [1]
查看完整版本: 关于数组指针的问题