c/c++语言开发共享c – 为什么将字符指针索引为int是有意义的?

char *a = "apple"; printf("%sn", a); // fine printf("%sn", a[1]); // compiler complains an int is being passed 

为什么索引字符串指针给我一个int? 我期待它只是从第一个位置开始打印字符串(实际上当我使用&a[1]时会发生这种情况)。 为什么我需要获得地址?

    这就是[]运算符的定义方式 – a[1] ,当achar * ,在aa[0]是第一个)指向的char之后获取下一个char

    这个难题的第二部分是,当作为函数的可变长度参数列表的一部分传递时, char值总是被提升为int (或很少, unsigned int )。

    a等价于&a[0] ,它从第一个字符开始打印 – 因此从第二个字符开始打印&a[1]是有意义的。 你也可以使用a + 1 – 这完全相同。

    如果使用%c转换说明符(打印单个字符),则可以使用a[1]仅打印第二个字符:

     printf("%cn", a[1]); 

    表达式a[1]产生一个char ,并且在扩展为int的表达式中。
    您可以使用%c打印字符:

     char *a = "apple"; printf("%cn", a[1]); // prints 'p' 

    您可以使用a+1来实现您想要的效果

     printf("%sn", a+1); // prints 'pple' 

    另一种解释方法:

     char *a2 = a+1; // a2 points to 'pple' a[1] ≡ *(a+1) ≡ *a2 

    %s需要一个char *指针。 单独的Char被解释为整数。 而且,[1]给你第二个元素,而不是第一个元素!

    字符(即[1]求值的东西)是整数,但printf()的“%s”格式化程序需要一个指针。 请注意,检测到此错误的事实是某些编译器提供的扩展function – 它不是标准C的一部分。其他编译器只会在运行时失败,可能是核心转储。

     char *a = "bla" 

    a :是char* ,你应该使用%s作为printf(...) ;

    a[1]相当于*(a+1) ,则a[1]char ,你应该使用%c作为printf(...) ;

    &a[1]相当于&(*(a+1)) ,然后&a[1]char* ,你应该使用%s作为printf(...) ;

    这更像是一个指针问题。 为了更好地理解指针是如何工作的,请这样思考:

     char *j; 

    j是一个char*
    *j是一个char ,等同于j[0]
    *(j+1)是一个char ,相当于j[1]
    &(*j)char* ,与&j[0]等效,等同于j
    &j是一个char**

    另一个例子:

     char j** 

    j是一个char**
    *jchar*
    **j是一个char ,等价于*(*(j+0)+0) ,等价于j[0][0]
    &j是一个char***

    等等…

      以上就是c/c++开发分享c – 为什么将字符指针索引为int是有意义的?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560353.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐