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是一个指针,预先递增该指针,取消对该指针的引用。但是,必须注意运算符的优先级,因此将首先执行++
这两个解引用。建议阅读