<C和指针---读书笔记10>

傻傻的没弄清,字符数组和 字符串 .

第一点:  编译器遇到 双引号“ ”的时候,主要有一下集中情况:

char str[] = " abc"  :  不指定长度。

char str[2] = "abc" :  长度过短。

char str[3] = "abc" : 长度恰好,

char str[4] = "abc" :   长度恰好 多出1

char str[6] = "abc"  :  长度很长。

不指定长度时, 编译器遇到" " 会把它当成字符串来看,开辟3+1个char空间,分别存储 a、b、c、''

长度短时,编译器会报错.

长度恰好时,编译器不会报错.但是编译器编译只分配三个char空间,存储abc.

                   本来编译器想要补充一个 ‘'的,但是因为只有三个char空间,所以无法补。

长度为n+1,恰好能满足空间要求。

长度>n+1,尾部全部补''。这样又有些浪费是吧.

原则:  char [n] n决定了只开辟n个char空间, " "决定尾部是否填'' 。如果位置不够了,就不填,冗余的都填''

不适用单引号:   只使用大括号。

char str[3] = { ’a‘,’b‘,’c‘}        只开辟三个char空间.

char str[3] = { ’a‘,’b‘,’c‘,''}   编译器报错

 char str[] = { ’a‘,’b‘,’c‘,''}    开辟四个空间.

下面我们仔细分析下面这个程序:

#include <stdio.h>
#include <string.h> 
int main (void)  {
  
  char  str1[] = "abc";
//  char  str2[2] = "abc"; 
  char  str3[3] = "abc";   
  char  str4[4] = "abc"; 
  char  str5[7] = "abcd";
  char  str6[] = {'a','b','c'};       
  char  str7[4] = {'a','b','c',''}; 
  

  
   printf("%d

",str1); 
  printf("%d

",sizeof(str1)); 
  printf("%u

",strlen(str1)); 
//  printf("%d

",sizeof(str2)); 
//  printf("%u

",strlen(str2)); 
  printf("%d

",str3);  
  printf("%d

",sizeof(str3)); 
  printf("%u

",strlen(str3));
  printf("%d

",str4);   
  printf("%d

",sizeof(str4)); 
  printf("%u

",strlen(str4)); 
  
  printf("%d

",str5);   
  printf("%d

",sizeof(str5)); 
  printf("%u

",strlen(str5));  
  
  printf("%d

",str6);   
  printf("%d

",sizeof(str6)); 
  printf("%u

",strlen(str6));    

  printf("%d

",str7);   
  printf("%d

",sizeof(str7)); 
  printf("%u

",strlen(str7)); 
  
  
   printf("------

");
   printf("%c

",*(char *)2358951);
   printf("%c

",*(char *)2358952);
   printf("%c

",*(char *)2358953);
   printf("%c

",*(char *)2358954);
   printf("%c

",*(char *)2358955);
   printf("%c

",*(char *)2358956);
   printf("%c

",*(char *)2358957);
   printf("%c

",*(char *)2358958);
   printf("%c

",*(char *)2358959);
   printf("%c

",*(char *)2358960);
   printf("%c

",*(char *)2358961);
   printf("%c

",*(char *)2358962);
   printf("%c

",*(char *)2358963);
   printf("%c

",*(char *)2358964);
   printf("%c

",*(char *)2358965);
   printf("%c

",*(char *)2358966);
   printf("%c

",*(char *)2358967);
   printf("%c

",*(char *)2358968);
   printf("%c

",*(char *)2358969);   
   printf("%c

",*(char *)2358970);
   printf("%c

",*(char *)2358971);
   printf("%c

",*(char *)2358972);
   printf("%c

",*(char *)2358973);
   printf("%c

",*(char *)2358974);
   printf("%c

",*(char *)2358975);   
        
}

  

                 

结果如下:

   char str7[4] = {'a','b','c',''};  首地址在  51地址. 四个char型空间.51-52-53-54

    char str6[] = {'a','b','c'};  只分配三个char空间. 地址在55-56-57

    char str5[7] = "abcd"; 分配了7个空间.地址在58-59-60-61-62-63-64

    char str4[4] = "abc"; 分配4个空间,地址为 65-66-67-68

    char str3[3] = "abc"; 只分三个地址,无法补'' .地址为 69-70-71

    char str2[2] = "abc"; 编译器会报错,注释掉

    char str1[] = "abc"; 分配四个char空间,末尾补'',地址为 72-73-74-75

   

故sizeof str1 =4 。 strlen =3

sizeof str3 =3 。strlen = 6

sizeof str4 =4 。strlen =3

 sizeof str5 =7 。strlen =4

  sizeof str6 =3 。strlen =7

  sizeof st7 =4 。strlen =3

字符串常量 和字符串变量

什么? 字符串还分常量和变量.更晕了,那我们之前定义的,到底是常量还是变量啊? 

这里你要先弄清两个问题:

 char  str[] = "abc" ; 这句话到底是什么意思。  创建一个数组,长度为3+1。 并且初始化为abc. 

                                它最基本的意思是创建数组,附带着进行初始化。

                                这种情况下, 数组的内容当然是可以修改的啦. 所以它定义了一个 字符串变量。

char  *p = "abc" ; 这句话什么意思? 它是要定义一个char指针,指向"abc";

                              编译器会把"abc" 当成常量. 那么 p就是指向常量的指针.显然通过p间接修改常量是不允许的.

char数组 和字符串数组的区别.

字符串: 是一串以''结尾的字符集合,必要要以''结尾。 如果定义的数组长足,不足以尾部填入'', 只能算作是 char数组.

             长度足够的话,编译器会在数组尾部补'‘,使得它是一个字符串。

{ } 和 " "区别

   { } 是元素的列表,编译器不会为它自动的补'' 。 若里面没有 ’‘ ,那它就仅仅是一个char数组。

 " " : 如果和指针配合,自动补'',是定义一个指向字符串常量的指针。

          如果和数组配合, 看数组的长度是否能容下'' 。 能容下就是字符串.容不下就是char数组.

因此一般定义 字符串变量,借用数组.      定义字符串常量 用指针类型.

注意数组长度, 注意" " 和{}区别。

这个小节有点乱....

                         

原文地址:https://www.cnblogs.com/mokang0421/p/7487594.html