`
heiheben
  • 浏览: 137359 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

字符数组的特殊性

阅读更多

在讨论她的他特殊性之前我们先来说一下,为什么就只有字符数组不一样呢!
原因是:设计者认为如果存储的是字符数组,单单取出某个字符是没有任何意义的.所以编译器就字符串进行了特殊的处理.
下面就来看看她的特殊性都体现在哪些方面:
1,初始化
通用的数组初始化方法对于字符数组同样适用
1.指明数组大小
char c[4] = {'a', 'b', 'c'};
2.由初始化元素决定数组大小
char c[] = {'a', 'b', 'c', '\0'};
char c[] = {'a', 'b', 'c', 0}; //0是\0的ASCII码值
注意:
    如果采用上述方法初始化,不要忘了结束标记'\0',不加结束标记引起的后果见例题.

字符数组的特殊初始化方法:
1.采用cin语句初始化
char c[100];
cin>>c;
2.使用字符串直接初始化
char c[] = "Hello";

以上还有一个不同的地方是:采用cin语句初始化的时候,声明和初始化已经分开了!也只有字符数组可以这样做!

2,赋值
对变量的第一次赋值也称为初始化.

普通数组的赋值要足个元素进行赋值.(理解一下赋值和初始化的区别)
字符数组的赋值可以调用strcpy完成.
例如:
int i[10];
i[0] = 12;
i[1] = 2;
... ...

char c[20];
strcpy(c,"Hello");

3,运算
这里主要说说字符数组的比较大小
普通数组来比较大小,一般都是通过一个循环来实现.
字符数组的比较有个专门的函数strcmp来实现,具体实现见例2.

4,输出
打印普通数组,显示地址
打印字符数组,显示其内容.

char_array_sample1.cc

      1 #include<iostream>
      2 using namespace std;
      3
      4 int main(){
      5     int a[] = {1,2,3};
      6     char c[] = {'a','b','c'};//,'\0'};
      7     //char c[] = {'a','b','c',0};
      8     //char c[4] = {'a','b','c'};
      9     char c1[] = "abcdef";
     10     cout<< "a: " << a << endl;//打印整形数组名,输出的为整个数组的首地址
     11     cout<< "c: " << c << endl;//打印字符数组名,输出的为整个数组的元素
     12     cout<< "c1: " << c1 << endl;
     13     cout<< "sizeof a : " << sizeof(a) << endl;
     14     cout<< "sizeof c : " << sizeof(c) << endl;
     15     cout<< "strlen(c) : " << strlen(c) << endl;
     16     cout<< "sizeof c1: " << sizeof(c1) << endl;
     17     return 0;
     18 }

执行结果:
a: 0xbfffefb0
c: abcB
  B革??9?
c1: abcdef
sizeof a  : 12
sizeof c  : 3
strlen(c) : 17
sizeof c1 : 7

到这里,可能会有疑问了:
为什么sizeof(c)等于3,而strlen(c)等于17?
对于sizeof来讲,它是以你的初始化列表决定的,初始化列表中只有'a' 'b' 'c' 三个元素,所以其值为3
而strlen,它的参数为字符数组的首地址,它会从这个地址一只查下去,直到'\0'结束,所以在这里显示的为错误值17.

char_array_sample2.cc

     1 #include<iostream>
      2 using namespace std;
      3
      4 int main(){
      5     char name[50];
      6     char name2[50];
      7     memset( name, 0, sizeof(name) );
      8     memset( name2, 0, sizeof(name2) );
      9     cout<<"strlen( name ) = " << strlen( name ) << endl;
     10     strcpy( name, "hello world" );
     11     cout<<"strlen( name ) = " << strlen( name ) << endl;
     12     cout<<"name = > " << name << endl;
     13
     14     //strcpy( name2, name );
     15     strcpy( name2, "have a nice day" );
     16     cout<<"name2 = > " << name2 << endl;
     17
     18     if(strcmp(name, name2) == 0){
     19         cout<<"equals" << endl;
     20     }else{
     21         cout<<"not equals" << endl;
     22     }
     23
     24     /*这样进行比较,只是比较了两个指针的大小
     25     if(name == name2){
     26         cout<<"name equals name2" << endl;
     27     }else{
     28         cout<<"name doesn't equals name2" << endl;
     29     }
     30     */
     31
     32     return 0;
     33 }

char_array_sample3.cc
      1 #include<iostream>
      2 using namespace std;
      3
      4 int main(){
      5     char name[50] = "liucy";
      6     cout<<"name = " << name <<endl;
      7
      8     char* pname = "liucy";
      9     cout<<"pname = " << pname <<endl;
     10
     11     strcpy( name, "huxinzhe" );
     12     cout<<"name : " << name <<endl;
     13
     14     //strcpy( pname, "huxinzhe" ); //an error
     15     //cout<<"pname : " << pname <<endl;
     16
     17     return 0;
     18 }
这个例子稍微难点:
第5行应该没问题,这是字符数组初始化的特殊性之一
第8行可能优点问题,因为数组的本质就是指针,所以char 类型的指针也可以这样初始化.
只是有一点要注意,这时的"liucy"是放到数据区的字面量,通过赋值运算符将它的地址付给了pname ,这个时候可以知道pname是指针常量,它所指向的空间里的内容不允许修改.所以第14行是个错误.
为什么name可以被从新赋值,因为它本身指向一个50字节大小的空间,name的赋值过程实际上是一个字符拷贝的过程.
 

分享到:
评论

相关推荐

    字符数组转换成字符串

    字符串则是一个特殊的字符数组,它以空字符'\0'作为结尾,表示字符串的结束。在C语言中,可以使用`"..."`双引号来创建字符串字面量,它们会被自动存储为字符数组,并在末尾添加空字符。 接下来,我们讨论如何将字符...

    字符数组与字符指针

    字符数组是一种特殊的数组类型,用于存储字符串。字符串通常是由字符序列组成的数据结构,包括但不限于字母、数字和特殊符号等。在C/C++中,字符串实际上是以空字符(`\0`)结尾的一系列字符。 **定义方式:** ```...

    栈字符数组&混淆指针和数组所导致的错误

    通过深入理解这些概念,你可以更好地编写代码,避免因栈字符数组和指针数组混淆而产生的错误,提高程序的稳定性和安全性。在实践中,应多加注意这些细节,不断积累经验,才能写出更加健壮的程序。

    思维挑战14:字母排序-字符数组.zip

    在这个“思维挑战14:字母排序-字符数组”的主题中,我们主要关注的是如何使用C语言来处理字符数组,特别是对字母进行排序。C语言是一种底层编程语言,它提供了直接操作内存和数据结构的能力,因此非常适合这样的...

    C语言字符数组初始化

    ### C语言字符数组初始化详解 #### 一、字符数组的定义与初始化 在C语言中,字符数组是一种存储字符序列的数据结构,它允许程序员通过数组的形式来存储和操作字符串。字符数组的初始化是指在声明数组时为其分配...

    字符数组PPT学习教案.pptx

    字符数组本质上是数组的一种特殊形式,专门用于存放一系列的字符。以下是对字符数组的一些关键知识点的详细解释: 1. **字符数组的定义**: 类似于其他类型的数组,字符数组可以定义为`char c[数组长度]`。例如,`...

    10章字符数组和字符串[定义].pdf

    换句话说,字符串是特殊形式的字符数组,它的最后一个字符必须是NULL,这个特殊的字符在ASCII码表中位于第一位,用16进制表示为0x00。 在C语言中,字符数组的长度是固定的,这意味着在声明时就需要指定大小。例如,...

    C语言数组:C语言数组定义、二维数组、动态数组、字符串数组_C语言中文网1

    字符数组常用于存储字符串,因为C语言将字符串视为字符数组的特殊形式。字符串的结束标志是空字符 '\0'。例如,`char str[10] = "Hello"` 创建了一个包含5个字符(不包括结束符)的字符串。字符串处理函数如`strlen...

    C语言实验报告——数组

    2. **字符数组与字符串**:字符数组用于存储字符串,字符串在C语言中是以空字符('\0')结尾的字符序列。理解字符数组与普通数组的区别,如字符串不可变性,以及掌握字符串处理函数,如`strlen()`、`strcpy()`、`...

    MATLAB教程 第三章 字符串数组、元胞数组.doc

    字符串在MATLAB中是一种特殊类型的数组,它由单一字符组成。在MATLAB R2016b及以后的版本中,字符串被作为第一类公民对待,有自己的数据类型。在【例3.1-1】中,我们看到数值变量`a`和字符串变量`b`的区别。`a`是一...

    快速解决C# android base-64 字符数组的无效长度问题

    总之,解决“Base-64 字符数组的无效长度”问题的关键在于理解Base64编码的细节以及不同平台间的兼容性问题。在Android与C#之间进行Base64字符串传递时,确保正确的字符编码和解码策略,可以避免这类问题的发生,...

    c语言字符数组与字符串的使用详解

    - 在C语言中,字符串实际上是一种特殊的字符数组,其特征是数组的末尾有一个结束符`\0`。例如,字符串"I am happy"在内存中实际上是`{'I',' ','a','m',' ','h','a','p','p','y','\0'}`。 - 当用字符串常量初始化...

    C++字符数组的输入输出和字符串结束标志使用讲解

    在C++编程语言中,字符数组是存储字符串的基础数据结构。字符数组本质上是一个可以容纳多个字符的数组,每个字符在内存中占据一个字节。本文将深入探讨字符数组的输入输出以及字符串结束标志的使用。 首先,让我们...

    JAVA 数组与字符串课程文档

    Java中的数组和字符串是编程中基础且重要的概念,它们在许多场景中都有广泛的应用。数组是一种数据结构,它能够存储相同...在实际编程中,还需要注意数组越界、字符串操作性能优化等问题,以确保程序的正确性和效率。

    字符串排序(含思维过程图)

    在C语言中,字符串是字符数组的特殊形式,通常以空字符'\0'作为结束标志。因此,对字符串排序意味着对这些字符数组进行比较和重新排列。有多种排序算法可以用于字符串,比如冒泡排序、选择排序、插入排序、快速排序...

    LABVIEW第6章字符串、数组、簇和矩阵.pptx

    - **字符串函数** 包括基本的字符串操作,如拼接、分割、查找、替换等,以及数据数组和电子表格之间的转换函数,这些函数极大地提高了字符串处理的效率和灵活性。 **6.2 数组(Array)** 数组是存储同类型数据集合...

    C++C字符串总结.pdf

    - 当字符数组用于存储字符串时,其特殊性体现在最后一个字符总是'\0',这标志着字符串的结束。 2. **字符串常量**: - 双引号包围的字符序列被称为字符串常量,例如"HELLO"。编译器会自动在字符串常量的末尾添加'...

Global site tag (gtag.js) - Google Analytics