0、char

  • 项目列表c语言中char是容纳单字符的一种基本数据类型,存储的是ASCII码(如A:65)



1、字符串

  • 定义字符串数组时,必须让编译器知道需要多少空间。
  • 字符串用字符’\0’结尾的char数组表示,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组。
  • 字符串的两种声明方法:
    a、const char * pt1 = "Something is pointing at me.";
    有如下性质:
    pt1 == &pt1[0];
    *pt1 == 'S';
    *(pt1+1) == pt1[1] == 'o';
    putchar(*(pt1++));
    指针形式(*pt1)使得编译器为字符串在静态存储区预留29个元素的空间。另外,一旦开始执行程序,它会为指针变量pt1留出一个储存位置, 并把字符串的地址储存在指针变量中。该变量最初指向该字符串的首字符, 但是它的值可以改变。因此,可以使用递增运算符。例如,++pt1将指向第 2 个字符(o)。

    b、const char ar1[] = "Something is pointing at me.";
    有如下性质:
    ar1 == &ar1[0];
    *ar1 == 'S';
    *(ar1+1) == ar1[1] == 'o;'
    数组形式(ar1[])在计算机的内存中分配为一个内含29个元素的数组.但是,程序在开始运行时才会为该数组分配内存;此时,才将字符串拷贝到数组中。注意,此时字符串有两个副本。一个是在静态内存中的字符串字面量,另一个是储存在ar1数组中的字符串。此后,编译器便把数组名ar1识别为该数组首元素地址(&ar1[0])的别名。这里关键要理解,在数组形式中,ar1是地址常量,不是一个变量。不能更改ar1,如果改变了ar1,则意味着改变了数组的存储位置(即地址)。可以进行类似ar1+1这样的操作,标识数组的下一个元素。但是不允许进行++ar1这样的操作。但地址ar1一但作为实参传入函数,那么形参就会变成a的指针。

  • 字符串两种方式的特点
    a、用指针修改字符串,直接修改静态存储区,可能会导致其他内容相同的(数值同为”Something is pointing at me.”)的字符串内容也受到改变。因此指针通常不用来修改字符串
    const char * pl(或char const *p1) = "Something is pointing at me."; // 推荐用法(*p1的值为const,指针位置可变,但不能用指针修改指向位置的元素)【char* const ptr则是不能更改指针指向位置】

    b、数组名ar1是常量,而指针名pt1是变量。ar1始终指向ar1[0],但pt1可变,可对pt1重新赋值,如
    pt1++;printf("%s",pt1);//结果为omething is pointing at me.



2、字符串数组

  • 字符串数组的两种声明方法
    a、const char *ptchar[LIM] = { “aa”, “bb”, “ccc”};
    b、char arrchar[LIM][SLEN]= { “aa”, “bb”, “ccc”};

  • 字符串数组两种方式的特点
    a、ptchar数组是一个内含3个指针的数组,在我们的系统中共占用24字节。ptchar中的每个元素的大小不同,效率更高。因此如果要用数组表示一系列待显示的字符串,请使用指针数组,因为它比二维字符数组的效率高。
    b、arrchar是一个内含3个数组的数组,每个数组内含3个char类型的值,共占用9字节。arrchar中的每个元素的大小必须相同,而且必须是能储存最长字符串的大小;且是一个副本,存储效率较低。但当指针指向的字符串字面量需要更改时,需要使用arrchar的形式;
分类: 未分类

0 条评论

发表评论

邮箱地址不会被公开。