【工作笔记】C语言的字符串真麻烦,好好梳理下

来源:互联网 发布:抗美援朝有必要吗 知乎 编辑:程序博客网 时间:2024/04/30 12:17

C的字符串


C的字符串很麻烦,不能像C++那样对字符串+ ,长度又不能随便变。真TMD烦,有一句粗话真不知道当讲不当讲。时间全都浪费在处理字符串上了。这个笔记中我要好好总结下,避免浪费时间。

这里写图片描述


各种变量内存模型图


这是一个前辈写的,非常详细转自网络,大一大二时就看到过,现如今再看看感觉跟神图一样。

int a = 0;                    // 全局初始化区char *p1;                     // 全局未初始化区int main(){    int b;                    // 栈    char s[] = "abc";         // 栈    char *p2;                 // 栈    char *p3 = "123456";      // 123456在常量区,p3在栈上。    static int c = 0;         // 全局(静态)初始化区    p1 = (char *)malloc(10);    p2 = (char *)malloc(20);  // 分配得来得10和20字节的区域就在堆区    /* 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。*/    strcpy(p2, p3);}



字符串

看了上面的代码,再看看这里的代码就会有感觉。

#include <stdio.h>#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) {    char *str="jingjing";       // 常量形式 字符串"jingjing"存放在常量区    char arrStr[]="jingjing";   // 数组形式 字符串"jingjing"存放在栈中     /* 操作 */    //str[1]='p';                   // 不合法 报错     arrStr[1]='p';                  // 合法     printf("%s\r\n", str);    printf("%s\r\n", arrStr);    return 0;}

上面代码中两个字符串都在函数中,但是意义却不同。为什么字符串是"jingjing" 因为当时写这个博客时在公司,抬起头正好看到一个叫菁菁的女生。

字符串在栈中

char arrStr[]="jingjing" // 指针和字符串都在栈中;

上面的这个字符串部分在栈中,arrStr这个指针也在栈中。原理应当是C标准的规定。怎么记住呢?这样助记:在一个字符数组里,每一位存放一个字符 'j', 'i', 'n' ... 'g'

常量指针

str 是一个可以移动的指针。 str++ str-- 都是合法的。
arrStr 是一个常量指针arrStr++ arrStr-- 都是不合法的。

总结

万物皆对立统一,矛盾具有普遍性 哲学一定是客观存在的,且具有普遍性。我相信C的字符串这么麻烦,一定有利好的作用。
这里写图片描述

1 0
原创粉丝点击