zoukankan      html  css  js  c++  java
  • <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数组.

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

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

    这个小节有点乱....

                             

  • 相关阅读:
    转:win2000/2003 Discuz生存环境搭建及基础优化
    http://db.grussell.org 测试答案 1
    转:linux系统的主机做代理服务器
    C# code 0002
    Welcome to .NET BY C#
    几篇关于Visual Studio Team Foundation Server (TFS) 安装的文章
    VS2003不知道怎么不能编译C文件
    Kaspersky 更新修复
    入行性能测试两个月
    WMI 注册表 StdRegProv
  • 原文地址:https://www.cnblogs.com/mokang0421/p/7487594.html
Copyright © 2011-2022 走看看