• 字符串数组与字符串指针


      这本来是前天写的内容,一直拖到了现在,本来打算今天晚上写,又怕拖到明天,现在写了吧。该死的拖延症。

      在编程的时候这块遇到好几次问题。而且越看越糊涂,上网查了查,自己写一写,看看对不对。有雷同,有改进。

    字符串数组与字符串指针的区别

      C中没有字符串数据类型,一般使用数组对字符串进行各种操作。

    (1)字符串指针

      字符串指针是定义了一个指针变量,指针变量存储的是某个字符串的内存首地址。他是指针变量被放在内存中的栈区。在编译器编译时,会自动在字符串结尾处添加结束标识符''。

    (2)字符串数组

      字符串数组是用数组来存储字符串。字符串数组作为变量存储在内存中的栈区。C对于字符数组没有硬性规定一定要在末尾处添加结束符,即可有可无。但好多字符串函数都是以结束符作为判断的标志,所以要注意在使用字符数组时记得在末尾处添加结束符。

    (3)关于字符串指针和字符串数组初始化的问题

      首先解释字符串常量。字符串常量是这静态存储区中的一段连续的内存,以''结束。只读,不可修改。

      a.字符串指针初始化

      可使用字符串常量对指针初始化,如下所示:

        char *p = "hello world";

        或

        char *p; 

        p = "hello world";

      使用字符串常量对指针初始化时,指针是变量存储在内存中的栈区,字符串常量存储在静态存储区,不可修改,如果修改会出现未定义错误。例子:

        char *p = "hello world";

        *(p + 1) = 'E';               //这样的赋值是错误的,不能更改字符串常量

      b.字符数组初始化

      可使用字符串常量对数组初始化,如下所示:

        char str[] = {"hello world"};

      也可以对数组单个元素初始化,如下所示:

        char str[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

      使用字符串常量对数组初始化时,数组作为变量存储在内存中的栈区,字符串作为元素值被放在数组所分配的内存空间中。且可对数组元素进行修改。

        char str[] = {"hello world"};

        str[0] = ’H';             //这样的操作是正确的

      (4)字符串数组中的结束符问题

      C对于字符数组没有硬性规定一定要在末尾处添加结束符。

      a.当表明数组大小时,

        char str[4] = {"Good"};

      b.当未表明数组大小时,

        char str[] = {"Good"};

        即 char str[0] = {'G'}; char str[1] = {'o'}; char str[2] = {'o'}; char str[3] = {'d'}; char str[4] = {''};

      上述是表明数组大小与未表明数组大小编译器的方式

      (5)使用指针时要防止出现段错误,防止指针指向内存中不明空间。

      当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
      一个错误的例子,如下:       
               char *name;
               scanf("%s",name);
               printf("%s",name);
      有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
        数组的方法:
                     char name[20];
                     scanf("%s",name);
                     printf("%s",name);
         
        给字符针针分配内存空间的办法:
                     char *name;
                     name=(char*)malloc(50);      //此时name已经指向一个刚刚分配的地址空间。
                     scanf("%s",name);
                     printf("%s",name);

  • 相关阅读:
    基本MVVM 和 ICommand用法举例(转)
    WPF C# 命令的运行机制
    628. Maximum Product of Three Numbers
    605. Can Place Flowers
    581. Shortest Unsorted Continuous Subarray
    152. Maximum Product Subarray
    216. Combination Sum III
    448. Find All Numbers Disappeared in an Array
    268. Missing Number
    414. Third Maximum Number
  • 原文地址:https://www.cnblogs.com/xmhsincere/p/4915354.html
Copyright © 2020-2023  润新知