c - C语言程序输出中的指针

标签 c pointers char output

我有一个问题:

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

int main()
{
    printf("%s ", *--*++cpp+3);

}

我无法理解输出 = sQUIZ , 我的方法:首先它将指向 cpp+3 即 c 现在++c 意味着指向“MCQ”,* 其中将给出值“MCQ”,无法理解 * 之前的 -- 在这里会做什么。或者我的方法完全错误?

最佳答案

我会将其作为评论中提到的答案发布。您应该首先阅读:http://en.wikipedia.org/wiki/Sequence_point还看here您可以在互联网上搜索数十篇有关序列点的文章。这些东西与未定义的行为未指定的行为一样糟糕。您可以阅读this帖子,特别是已接受答案中的未定义行为和序列点之间的关系是什么?部分。

也许这个面试问题暗示了你对序列点的了解,那么它并不像我所看到的那么基础,但是永远不会编写这样的代码,即使是为你的宠物项目,我甚至不想提及生产代码。这很愚蠢。

如果他们寻找经验丰富的 C++/C 开发人员,他们根本不应该问这样的问题。

编辑

只是关于序列点的提示,因为我在其他发布的答案和评论中看到了一些误解。这是*--*++cpp+3而不是未指定的行为未定义的行为(我的意思是它通常是一个糟糕的代码) ,但是这个是:

int i =1;    
*--*++cpp+i+i++;

上面的代码是未排序未指定。请阅读未定义行为未指定行为实现定义行为序列点之间的差异e.g. here我写这一切是为了向您解释为什么您应该完全避免如此糟糕的代码(无论从语言标准的角度来看它是否合法)。是的,您的代码是合法的,但不可读,而且,正如您在我的编辑中看到的那样,一些小的更改使其非法。不要以为我们不想帮助您,我的意思是,无论在哪里询问,与您类似的代码通常都是糟糕的代码。如果他们要求你解释为什么这样的代码是糟糕且脆弱的,那就更好了 - 那么这将是一个很好的面试问题。

附注实际输出是一个空字符串,因为您打印了一个空终止符。请参阅下面的一个很好的答案 - 它解释了前面的 C 运算符的输出(您也应该学习它,这样这些问题就不会打扰您了)。

关于c - C语言程序输出中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778552/

相关文章:

c++ - 关于 linux 中的动态缩放,程序在时钟周期中的意外执行时间

c - sh: 系统调用内存不足

c - getaddrinfo (WinAPI pure C) Visual C++ 2010 访问冲突错误

Java:从数组中获取字符输入会导致无限循环

c - 为什么 printf 中的格式标记为 restrict?

c - 如何给通过指针运算计算出的内存地址赋值?

c - 释放三维矩阵的内存

c - 将值填充到指针数组

c - scanf 一次获取多个值

java - 如何在java中从 double 组创建char数组?