我在理解下面的代码的输出麻烦

问题描述:

我有以下程序:我在理解下面的代码的输出麻烦

int main() 
{ 

    char arr[] = "geeksforgeeks"; 

    char *ptr = arr; 

    while(*ptr != '\0') 

     ++*ptr++; 

    printf("%s %s", arr, ptr); 

    getchar(); 

    return 0; 
} 

输出:hffltgpshfflt

给出的解释是:

如果一个人知道的优先级和结合那么运营商就没有多少东西了。以下是运营商的优先级。

Postfixx ++   left-to-right 
Prefix ++    right-to-left 
Dereference *   right-to-left 

因此表达++*ptr++具有以下效果:

  • *ptr值被递增
  • ptr值被递增

我的问题是如何这个指针表达++*ptr++越来越实施,为什么这个声明“printf("%s %s", arr, ptr);”不打印字符串“geeksforgeeks”以及? 请帮忙。

+0

它怎么可能打印“geeksforgeeks”? ''arr''中的所有字符都已增加,原始字符串不再存在。注意''ptr''输出为空字符串,因为它最终指向''arr''结尾的空字符。 – jasonharper

+0

所以你的意思是说,通过指针ptr,我们改变了原来的arr,因此改变后的事物现在是“hffltgpshfflt”? @jasonharper –

+0

是的,正好。 ''ptr''依次指向''arr''的每个元素(当它到达末尾的空字符时停止),这些元素是前导'++''递增的。 – jasonharper

回答 - >为什么这个语句“printf(”%s%s“,arr,ptr);”不打印字符串“geeksforgeeks”以及?

这里,arr的数组元素增加1,即g + 1 = h,e + 1 = f ....所以由于++ * ptr增加了ptr值。 ptr ++将递增1,这意味着ptr地址增加'1'。直到空字符。

所以,你正在打印arr它显示的值为hffltgpshfflt并且打印现在指向NULL的ptr,它不打印任何东西。你可以通过%x格式检查ptr值,它打印0.