以下内容为自学笔记缺乏严谨性,如有错误和不足请大佬指正
(1)字符数组与字符串的区别?
字符串要有结束标记'\0',有'\0'的字符数组才能叫字符串,打印时读到'\0'就结束,在字符数组初始化时比如char str[]="abc",会默认在结尾加个'\0',数组长度为4因为'\0'也占一个字符
char arr[10]={'a','b','c'}; 其他元素默认0因此打印时也可以正常结束
char arr2[5]; arr2[0] = 'a'; arr2[1] = 'c'; arr2[1] = 'f';
打印时arr2就不可以正常结束,因为没有'\0',其余元素也没有进行初始化
char arr3[]={'a','b','c'}; 由于[]中没有给值所以arr3的长度是根据给的元素的个数算的,也就是3自然也就不会有0,所以arr3不能正常结束打印
(2)字符串常量的创建过程?
char str[]="abc"时,首先会在常数区创建一个字符串常量"abc","abc"代表的是字符串常量在常数区的地址,再将字符串常量拷贝进栈区的str字符数组
(3)char *p = "abc"; *p-=32;的bug原因?
"abc"是字符串常量,p只是指向这个常量的指针,而常量是不可被修改的所以会报错.
(4)char str[] = "abc"与char *str = "abc"的区别?
char str[]="abc"首先会在常数区创建一个字符串常量"abc","abc"代表的是字符串常量在常数区的地址,再将字符串常量拷贝进栈区的str字符数组
sizeof(str)得到是数组空间大小
可以str[偏移量]来对栈区数组内的元素改变
数组名是地址常量str的指向不可以改变,他只能指向数组在栈区的地址
char *str = "abc"只是创建了一个叫str并指向这个常量的指针
sizeof(str)得到是指针空间大小
无法通过指针str来改变常数区的字符串常量
str可以改变指向