idc网站模版,wordpress4.8速度慢,网络推广对产品销售的重要性,西安seo和网络推广前言 #xff08;1#xff09;休闲时刻刷B站#xff0c;看到一个卖课的#xff0c;发视频问#xff0c;char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 #xff08;2#xff09;看那个卖课博主一顿分析#xff0c;最后成功得出…前言 1休闲时刻刷B站看到一个卖课的发视频问char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 2看那个卖课博主一顿分析最后成功得出字符串比字符数组末尾多一个’\0’。 3很好成功浪费我生命的3分钟。无语就这水平还卖课。如果各位有幸看到这货希望能够保持清晰不要被这种无良卖课机构欺骗。 4为了防止被当成地图炮我声明一下我只diss那种没啥实力乱忽悠的买课机构。对于教干货的培训机构我还是保持尊重态度的 浅层分析
存储大小 1就像那个卖课说的一样字符串比字符数组末尾多一个’\0’。因此字符串比字符数组的大小比字符数组大一个字节。 char arr1[]{H,E,L,L,O};
char arr2[]HELLO;
sizeof(arr1); //返回5
sizeof(arr2); //返回6因为最后有一个\0strlen()测试结果不一样 1那个卖课的也没有水到无药可救这个程度还是分析到了我还是有些许欣慰的。 2我们需要知道strlen()函数作用是什么。strlen()函数可以计算字符串的大小而strlen()函数底层实现是什么呢 3说白了一点一点的往后爬直到找到了ascii中的0。找到0之后退出while循环然后根据地址相减就可以得出字符串长度。注意因为char只有一个字节所以地址相减就可以直接得出字符串长度 1可能还有一些同学没有理解我直接拿上面的hello字符串分析假设hello字符串首字符’h’的地址为0x50。因此传入strlen()函数的str的值为0x50。 2const char *s str; 经过这一句s也是0x50。 3第一次while()*s为0x48字符’H’的ASCII值是0x48所以进入循环s自增从0x50变成0x51。 4按照3的步骤来4次s是0x54的时候在 while (*s)的时候*s为0x4F字符’O’的ASCII值是0x48此时s再次自增。 5关键来了第五次while (*s)的时候我们发现*s的值居然是0于是退出while()循环。 6然后s - str 5即可计算出字符串长度了。 size_t strlen(const char *str) {const char *s str;while (*s)s;return s - str;
}4现在我们知道了strlen的原理之后我们再看看字符数组。字符数组中char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};的字符’O’后面的值是未知的可能是0也可能是一些其他值所以strlne()测试出来的字符数组长度是无法确定的 总结 1上面这些都是非常浅显的知识但凡认真学了C语言都懂的真心搞不懂那个卖课的搞到那么神秘兮兮的干嘛。 2总结起来就是字符串比字符数组末尾多一个’\0’因此导致存储大小和strlen()结果不一致。 深层分析
存储位置不一样 1字符串是存储在常量区的一般来说常量区存储在ROM中。 2字符数组存储位置要看情况而定。但是都是存储在RAM。 1如果字符数组是全局变量就存储在静态数据区。 2如果字符数组是局部变量就存储在栈中。 修改权限不一样 1字符串是存储在常量区的所以说字符串没有修改权限。CPU无法对字符串修改。 2字符数组要么是静态数据要么是栈中。CPU都能够对字符数组进行修改。 断电存储大小不一样 1对于字符串而言他是在常量区所以即使机器断电他的数据依旧存在。 2但是对于字符数组而言假如他是局部变量。断电之后他的数据就会消失了。但是字符数组是全局变量他的数据还是会存在于ROM。 3这么不明白的同学可以看RAM明明断电会丢失数据为什么初始化的全局变量存储在RAM详细分析程序的存储