c语言进阶——字符串和一级指针内存模型

字符串基本操作

  • 在C语言中使用字符数组来模拟字符串
  • C语言中的字符串是以’\0’结束的字符数组
  • C语言中的字符串可以分配于栈空间,堆空间或者只读存储区

1、字符数组初始化

    //1 指定长度初始化 
    char buf2[100] = {'a', 'b', 'c', 'd'};  
    //如果初始化的个数大于内存的个数 编译错误
    //后面的buf2[4]-buf2[99]编译器自动设置为0 

    //2 不指定长度  
    char buf1[] = {'a', 'b', 'c', 'd'}; 
    //C编译器会自动求元素的个数
    //buf1是一个数组 不是一个以0结尾的字符串

    //3 用字符串常量来初始化字符数组
    char buf3[] = "abcd"; 
    char buf4[10] = "abcd";
    //buf3作为字符数组应该是5个字节 
    //作为字符串应该4个字节

2、数组法和指针法操作字符串

    int i = 0;
    char buf5[100] = "abcde";
    char *p = NULL;

    //下标法
    for (i=0; i<100; i++)
    {
        printf("%c", buf5[i]);
    }
    printf("\n");

    //指针法1
    for (i=0; i<100; i++)
    {
        printf("%c", *(buf5+i));
    }

    //指针法2
    printf("\n");
    p = buf5;
    for (i=0; i<100; i++)
    {
        printf("%c", *(p+i));
    }

既然数组名buf5实际上是指向首元素的指针,而指针有属于变量,那么是不是可以对buf进行操作呢?(如buf++)
答案显然是不能,因为在c语言中buf被设计成常量指针,只读不写。
为什么要设计成常量指针呢?
因为在程序结束析构内存时,要保证数组空间的全部释放,就不能改变基址的位置。

3、一级指针内存模型

    char buf[20]= "aaaa"; //定义并且初始化
    char buf2[] = "bbbb";
    char *p1 = "111111";
    char *p2 = malloc(100); 
    strcpy(p2, "3333");

你可能感兴趣的:(C语言进阶)