C++菜鸟提问有关字符串的strlen和sizeof的问题。
转义符的顾名思义,用来改变意义的,为啥要改变呢?有几种情况,一种是字符有语法上的意义,比如",它本身表示一个字符串的开始/结束,那如果要一个纯字符的引号呢,比如以下字符串:"He said: \"Not too bad!\"",
里面的引号用反斜杠转义,失去了语法上的意义,是单纯的一个引号字符。
另外有一些不可见的字符,和控制字符,比如换行,跳格,退格,这些都是用反斜杠加上可见字符表示的(\n \t \b),这里n t b失去了原有的意思。
再有,如果是反斜杠紧跟着数字的话,就代表八进制数,可以转义最多3位八进制数,最大是\377,这四位其实是一个字符,是ASCII的255,所以strlen("\377")的值其实是1
\023 这里也是一样的。
注意:如果是不超过了范围的,比如"\378",因为八进制里没有8,所以\37是一个八进制数,8是另一个字符,所以strlen("\378") = 2
此外,要想表示反斜杠本身,而不是转义符,则需要给转义符加转义符,即\\,前一个\是转义符,表示让后一个\失去转义符的意义,而变成一个单纯的字符\。
所有的这些情况下,转义符都是给代码作者用的,在运行时内存里不存在这个\,也就是说
反斜杠和它后面紧跟着的字符(单个或多个,最多可以3个)合起来算一个字符,反斜杠本身不占地方。
第二个知识点就是strlen和sizeof的区别,这个比较简单,当作字符串,长度不包括结束符,
结束符是0(或者写作'\0' 或者'\000',这里又复习一下转义符),占一个字节
第三个点是sizeof对数组和指针不一样,所以第二题无论字符串多长,sizeof指针都是4个字节(64bit平台占8字节)
但是!这道题里的\023会被认为是一个8进制的转义。这确实是符合规范的,但是这样的题目就是纯粹恶心人了。
这是字符串本身的知识,不会影响strlen和sizeof。
strlen是个函数,计算指针直到\0(不算)的长度,但此题中间那个不是\0,所以不会停下来。sizeof是个关键字,计算对象的大小,单位为字节。
sizeof数组会计算数组的大小,但是sizeof指针就只会算指针的大小。而指针大小是和平台有关的,64位永远是8,所以第二题也可也选A。