C 理解双指针的解引用

C 理解双指针的解引用,c,string,pointers,double-pointer,C,String,Pointers,Double Pointer,下面是我最近在线测试中提出的预测输出程序。我无法获得准确的输出,因为我不熟悉双指针解引用。我知道后缀操作的优先顺序和副作用,这对理解指针问题起着至关重要的作用 请通过给出双指针解引用的示例来帮助我理解这段代码。 有关单指针解引用的更多信息,请参见以下非常有用的答案: 这个问题可能没有实际用途,但它将有助于理解双指针的概念 *c++应该是c++作为*在这里没有任何效果。在此操作之后,它引用双指针数组的第二个值b(a+3) 在取消引用后,它指向指向a+3的指针,它增加了(因此它引用了指向a+4的

下面是我最近在线测试中提出的预测输出程序。我无法获得准确的输出,因为我不熟悉双指针解引用。我知道后缀操作的优先顺序和副作用,这对理解指针问题起着至关重要的作用

请通过给出双指针解引用的示例来帮助我理解这段代码。 有关单指针解引用的更多信息,请参见以下非常有用的答案:

这个问题可能没有实际用途,但它将有助于理解双指针的概念

  • *c++应该是
    c++作为
    *
    在这里没有任何效果。在此操作之后,它引用双指针数组的第二个值
    b
    a+3

  • 在取消引用后,它指向指向
    a+3
    的指针,它增加了(因此它引用了指向
    a+4
    的指针。另一次取消引用则指向
    a+4

  • 与前面的操作一样,
    c
    引用指向
    a+4
    的指针,
    **c
    引用
    a+4
    ,因此**c+2引用
    a+4
    的第三个字符

  • c+2
    是指向
    a+1
    的指针。然后**引用
    a+1
    。向其中添加2将引用
    a+1
    的第三个字符,即
    R
    。取消引用此指针将生成char
    'R'
    。向其添加2,则假设采用ASCII字符编码,则得到
    'T'


  • 首先,这是一个非常愚蠢的测试。忽略那些用模糊代码进行测试的公司。不要和白痴打交道。通常这些测试是由低水平的程序员进行的

    考虑到表达式中使用的数组指示符(很少有例外)会隐式转换为指向其第一个元素的指针

    所以这个宣言

    char ***c = b;
    
    相当于

    char ***c = &b[0];
    
    在这个表达式语句中

    *c++;
    
    未使用指针的解引用值。因此,此语句应按如下方式编写

    c++;
    
    在该语句之后,指针
    c
    指向数组
    b
    的第二个元素

    你可以像这样重写上面的语句

    c = &b[1];
    

    现在让我们考虑一下Prttf调用< /p>中的表达式

    printf("%s\t", *++*c)
    
    取消引用指针
    c
    将得到左值
    b[1]
    ,其值为
    a+3
    。将一元运算符++应用于此表达式将得到
    a+4
    。最后取消引用此表达式将得到左值
    a[4]
    这是输出的

    BREAK
    

    现在考虑PrTrF第二调用中的表达式。< /P>

    printf("%s\t", **c + 2);
    
    printf("%c", (*(**(c + 2) + 2) + 2));
    
    第一次取消引用指针
    c
    将获得左值
    b[1]
    。第一次调用printf后,它包含值
    a+4
    。取消引用此表达式将获得指向字符串文本“BREAK”的左值a[4].2指针表达式将指向字符串文本的第三个字符。因此将输出

    EAK
    
    T
    
    最后,我们考虑Prtff的第三调用中的表达式。
    printf("%s\t", **c + 2);
    
    printf("%c", (*(**(c + 2) + 2) + 2));
    
    当c指向b[1]时,使用指针算术
    c+2
    表达式将指向
    b[3]
    取消引用指针,您将得到包含值
    a+1
    的左值
    b[3]
    。取消引用此表达式,您将得到指向字符串文本
    的左值
    a[1]
    “SURATH”
    。再次应用指针算法,您将得到一个指针,指向字符串文本的第三个元素,即子字符串
    “RATH”“
    。取消引用指针表达式将得到字符
    'R'
    。将值2添加到字符中,将得到输出的字符'T'。”

    EAK
    
    T
    

    仅此而已。

    避免使用此类表达式。它们没有任何实际用途。事实上,如果我在代码审查中看到类似的内容,我会要求重写整个内容。同意@p_uj_u,但这个问题来自测试。我同意@p_uj_u。正如我提到的,这个问题来自测试,我只是想澄清我的双poi概念inter-dereference.about:
    char***c=b;
    从右到左读取表达式是最简单的,比如:
    *++*c
    。结果是:变量c是一个指针,预先递增该指针,取消对该指针的引用。但是,必须注意运算符的优先级,因此将首先执行
    ++
    这两个解引用。建议阅读