这是皮皮虾整理C语言的知识点皮皮虾整理的知识点逻辑性非常强非常清晰明了字符串与指针的关系字符串会隐式返回自身的首元素地址前提是用char *去匹配如果字符串只是在字符数组那么字符数组只会有字符串本身的字符内容char *str“hello” //此时“hello”返回字符h的地址所有这个指针str指向的是字符h的地址平时char a”abc”是错的但是为啥Char *str“hello”是对的呢因为Char a”abc”中”abc”已经返回了首元素地址但是char不是char*也不是单字符所以不行Char *str“hello”而这里char*刚好能匹配Char a”abc”深层原因是因为字符串的char*无法匹配char而不是char类型只能有一个字符这也是编译器报错的原因字符串的几种初始化通过字符串数组进行初始化Char str[10]”abcdefg”;Str[0]’a’;和字符串指针数组一样空间都是一样的只不过元素放的是地址在栈和静态全局区开辟了一片连续的空间普通的全局变量放在静态全局区普通的局部变量放在栈空间静态只读段 (.rodata) 不是专门给局部变量用的它属于整个程序全局、局部都可能用到它但是在栈的字符串很特殊先是把原始字符串abcdefg放在静态只读段然后栈空间目前只有数组本体然后静态只读段复制字符串到栈空间的数组意思是栈空间的字符串数组的字符串其实是静态只读段复制过来的静态只读段 (.rodata) 不是专门给局部变量用的它属于整个程序全局、局部都可能用到它普通小局部变量没有静态区模板数值写在机器指令里面。只有初始化的数据体量很大或者右边是字符串字面量时编译器才会在静态只读段放一份初始化模板运行时拷贝到栈。2.字符串在文字常量区的初始化字符串在文字常量区开辟一段连续的空间将字符串的首地址赋值给指针变量字符串要用char *匹对且char *就是他的指针变量只不过只能指向首元素地址非常重要平时遇见char *str是喊你写数组名指针名或者字符串常量这里的字符串常量后面不要修改就行Char *str”abcdefg” //这个指针是指向一个地方是可以变量名和值不在一个空间的这个指针变量在栈空间依旧是局部变量此时*str这个指针变量存的是首元素字符a的地址因为字符串只返回首元素地址3.字符串放在堆区初始化使用malloc、calloc、realloc等函数在堆区手动申请空间将字符串拷贝到堆区malloc有个缺点就是无论什么变量申请堆空间必须写出这个变量的指针因为malloc的返回值是一个地址所以不用担心前面定义还是没定义后面都会用指针为什么是拷贝到堆区因为一般先是在栈区初始化然后再用函数在堆空间申请malloc函数 allocateand free dynamic memory分配和释放动态内存malloc函数格式void是通用看你针对什么自己调整针对charChar *malloc(100);char *str(char *)malloc(100); 动态申请了100个字节的存储空间申请的空间的首地址给str赋值还可以写成Char *str(char *)malloc(sizeof(int))Char *str(char *)malloc(20 * sizeof(int))这样也可以意思就是分配四个字节的空间空间的首地址给str赋值但是此时char *str只是字符串指针变量只是给了他空间地址此时空间还没有内容指针不能不初始化此时用strcpy函数将静态只读区的字符串常量拷贝到空间里面Strcpy函数 strcopy的缩写计算机拷贝虽然是只指复制但是复制里面就已经有粘贴了char *dest 是目标字符串地址的意思写指针变量名就行const char *src 是来源字符串的意思str是起源意思strcpy(目标地址, 源字符串);目标地址写被分配空间的指针的变量名源字符串就是你被分配的空间放什么东西如Strcpy(str,”hello”)就是给str这个指针变量所指向的空间赋值字符串“hello”字符串的修改性字符串能否被修改取决于放在什么位置字符串也是连续内存类型一致也可以用数组下标访问但是字符串在文字常量区不能被数组下标修改字符串在数组和堆区可以被修改注意是字符串本身被修改文字常量区就是静态只读区字符串在文字常量区不可以被修改字符串不可被修改的情况字符串在文字常量区Char *str”hello”因为字符串也是内存连续类型一样也可以用数组下标访问所以printf打印str[0]’h’,str[1]’e’,但不能修改str[0]’c’此时char *str还是在栈区真正的hello是字符常量还在文字常量区意思是指针和字符串在不同的位置字符串也没有拷贝到str指针栈的位置但是变量和值一定要在一个空间不然为啥是指针这里指针变量的值存的是hello的地址字符串本身在其他地方此时char *str“world”是允许的因为真正的hello在文字查常量区并没有变而str[0]“r”这种就不允许了这种直接改变hello了程序报错误字符串可以被修改的情况字符串放在数组中可以被修改char a[6]”hello”a[0]’r’;字符串放在堆区可以被修改Char *str(Char *)malloc(100)Strcpy(str,”hello”)Str[0]’r’ //在堆区只能用数组下标字符串也可以用数组下标*str’r’总结:字符串最开始的初始化除了字符数组就是指针,字符串指针永远存的是字符串首地址字符串在指针对应数组下标只有a[0]在数组正常栈区和堆区的字符串都是被静态只读区字符串拷贝过来的只有指针的字符串只在静态只读区指针的字符串已经变成地址了