Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 需要了解二维阵列的输出_C_Arrays_C Strings_Pointer Arithmetic - Fatal编程技术网

C 需要了解二维阵列的输出

C 需要了解二维阵列的输出,c,arrays,c-strings,pointer-arithmetic,C,Arrays,C Strings,Pointer Arithmetic,这是密码 运行这个 #include <stdio.h> char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"}; char **cp[] = {c+3, c+2, c+1, c}; char ***cpp = cp; int main() { cpp++; printf("%s", cpp[0][0]); // TEST printf("%s ", cpp[-1][-1]); // TEST return

这是密码 运行这个

#include <stdio.h>

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

int main()
{
    cpp++;
    printf("%s", cpp[0][0]);  // TEST
    printf("%s ", cpp[-1][-1]); // TEST
    return 0;
}
#包括
char*c[]={“geksquick”、“MCQ”、“TEST”、“quick”};
字符**cp[]={c+3,c+2,c+1,c};
字符***cpp=cp;
int main()
{
cpp++;
printf(“%s”,cpp[0][0]);//测试
printf(“%s”,cpp[-1][-1]);//测试
返回0;
}
printf()的输出都是TEST。为什么会这样?当我执行cpp++时,指针移动到c+2。所以我知道cpp[0][0]将在“测试”的开始,这就是为什么它是打印测试。
有人能给我解释一下cpp[-1[-1]吗?

最初指针
cpp
指向数组的第一个元素
cp

char ***cpp = cp;
在此声明之后

cpp++;
指针
cpp
指向数组
cp
的第二个元素

cpp[-1]
给出数组的第一个元素
cp

注意表达式
cpp[-1]
的计算如下

*( cpp - 1 )
因此实际上这两种说法

cpp++;

可以认为类似于
*((cpp+=1)-1)
,如果在不增加指针的情况下写入
cpp[0]
,则具有相同的效果

数组
cp
的此(第一个)元素包含值
c+3
,该值是指向数组c的最后一个元素的指针

因此
cpp[-1][-1]
给出数组
c
最后一个元素之前的元素,该元素是指向字符串literal的第一个字符的指针
“TEST”

因此,这个printf调用将输出字符串文本

printf("%s ", cpp[-1][-1])

还请记住,在给出的代码中没有二维数组。所有数组,
c
cp
,都是一维指针数组。

char***cpp=cp;
初始化
cpp
以指向
cp
的第一个元素,即
cp[0]

cpp++
之后,
cpp
指向
cp[1]
。然后
cpp[-1]
cp[0]

cp[0]
包含
c+3
,它是指向
c[3]
的指针。因此
cp[0][1]
指的是
c[2]


<代码> C > [ 2 ] <代码>包含“代码>测试”<代码>,在它是指向“代码> >测试”<代码>的第一个元素的指针时,因此打印它打印“代码>测试”<代码> > < /p>在C++中,不应将字符串文字分配给<代码> char *<代码> <代码> CPP [ -1 ] [-1 ]。是未定义的行为,因为
-1
超出了数组的边界。对不起,这是一种C语言。我也不知道您是否习惯Python,但在C索引中
[-1]不是数组的后部,如果这是你正在尝试的DOBTW,这是你需要理解的东西,如果你想成为A,对于任何其他的东西,你应该编写更容易编写、阅读和理解的代码。我们可以把CPP++和CPP[-1 ]看作CPP(0)吗?这是我不理解的指针。@ AkHeleSeHang-War考虑X+ 1到1。结果是什么?它实际上与CPP++-1相同,因为CPP++的结果是CPP+1。我假设了别的东西。P:谢谢。我明白了。
printf("%s ", cpp[-1][-1])