VS2022中C语言间接寻址级别不同

下面这段代码是在VS2022上运行的,我想实现二级字符指针数组的访问,就是通过p访问到x这些字符串,然后运行的时候报错间接寻址级别不同,有无同学解答一下,刚学C语言,谢谢了!

# include <stdio.h>
int main()
{
    char x[] = "abcd", y[] = "bcde", z[] = "cdef";
    char m[] = "abcd", n[] = "bcde", f[] = "cdef";
    char o[] = "abcd", p[] = "bcde", q[] = "cdef";
    char* a[] = { x,y,z };
    char* b[] = { m,n,f };
    char* c[] = { o,p,q };
    char** p[] = { *a,*b,*c };
    for ( int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%s", *((p+i)+j));
        }
        printf("\n");
    }
    return 0;
}


img

修改如下,改动处见注释,供参考:

# include <stdio.h>
int main()
{
    char x[] = "abcd", y[] = "bcde", z[] = "cdef";
    char m[] = "abcd", n[] = "bcde", f[] = "cdef";
    char o[] = "abcd", p[] = "bcde", q[] = "cdef";  // 这行里已经定义指针 p
    char* a[] = { x,y,z };
    char* b[] = { m,n,f };
    char* c[] = { o,p,q };
    char** pt[] = { a,b,c };    // 这行里 p 不能重复定义, char** p[] = { *a,*b,*c }; 数组元素为 a b c
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%s", *(*(pt + i) + j)); // 输出里需解引用  printf("%s", *((p+i)+j)); 
        }
        printf("\n");
    }
    return 0;
}

#include <stdio.h>

int main()
{
    char x[] = "abcd", y[] = "bcde", z[] = "cdef";
    char m[] = "abcd", n[] = "bcde", f[] = "cdef";
    char o[] = "abcd", p[] = "bcde", q[] = "cdef";
    char* a[] = { x,y,z };
    char* b[] = { m,n,f };
    char* c[] = { o,p,q };
    char** ptr[] = { a,b,c };

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%s", ptr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^