`
heiheben
  • 浏览: 132095 次
  • 性别: 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的赋值过程实际上是一个字符拷贝的过程.
 

分享到:
评论

相关推荐

    C#语法字符串与数组的研究

    字符串简称串,是一种特殊的线性表,其特殊性在于串中的数据元素是一个个的字符。字符串在计算机的许多方面应用很广。如在汇编和高级语言的编译程序中,源程序和目标程序都是字符串数据。在事务处理程序中,顾客的...

    MATLAB数组字符串千字超详细解析

    MATLAB中的字符串是一种特殊的数组类型,它是由一串字符组成的序列,可以用来存储和处理文本信息。字符串在MATLAB中的表示形式是用单引号或双引号括...通过使用MATLAB数组字符串,可以提高工作和研究的效率和准确性。

    IOS开发之路–C语言数组和字符串

    数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等。而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符串数组。今天主要就介绍如下三个方面:...

    Javascript数组操作高级心得整理

    11. 特殊字符与注意点 15 (1) 特殊字符 15 (2) 注意点 15  JavaScript 对大小写敏感 15  空格 15  换行 15 第二章JavaScript对象 1. JavaScript对象简介 15 (1) JavaScript对象也是有属性和方法的 15  对象...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    10.4.2 使用字符串指针变量与字符数组的区别 158 10.5 函数指针变量 159 10.6 指针型函数 160 10.7 指针数组和指向指针的指针 161 10.7.1 指针数组的概念 161 10.7.2 指向指针的指针 164 10.7.3 main 函数的参数 166...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    10.4.2 使用字符串指针变量与字符数组的区别 158 10.5 函数指针变量 159 10.6 指针型函数 160 10.7 指针数组和指向指针的指针 161 10.7.1 指针数组的概念 161 10.7.2 指向指针的指针 164 10.7.3 main 函数的参数 166...

    精通matlab6.5

    第三章 字符串、元胞和构架数组 3.1 字符串数组 3.2 元胞数组 3.3 构架数组 3.4 关于数据类型的归纳性说明 第四章 数值计算 4.1 引言 4.2 LU分解和恰定方程组的解 4.3 矩阵特征值和矩阵函数 4.4 奇异值分解 4.5 函数...

    C++初学者指南(原版)

    相反,字符串作为字符数组实现。指针是包含内存地址的对象。通常,指针用于访问另一个对象的值。 第 5 章:函数简介 此模块开始深度探讨函数。函数是 C++ 的构建基块,深入理解函数是成为成功 C++ 编程人员的基础。...

    详解PHP对数组的定义以及数组的创建方法

    传统上把数组(array)定义为一组有某种共同特性的元素,这里的共同特性包括相似性(车模、棒球队、水果类型等)和类型(例如所有元素都是字符串或整数)等,每个元素由一个特殊的标识符来区分,这称为健(key)。...

    freexyn编程实例视频教程系列1:Matlab基础入门(PDF课件讲义)

    1.27 特殊字符 1.28 混合连接的类型 1.29 混合运算的类型 1.30 字符串型 1.31 缺失字符串 1.32 格式化文本 1.33 字符型与数值型的转换 1.34 元胞数组 1.35 元胞数组的修改 1.36 结构数组 1.37 结构数组的处理 1.38 ...

    javascript入门笔记

    使用场合:任意数字与1做按位与操作,可以判断奇偶性,结果为1,则为奇数,否则为偶数 0 :0 1 :1 2 :10 3 :11 4 :100 5 :101 5 & 1 101 001 ========== 001 4 & 1 100 001 ==== 000 2、按...

    c语言数据结构字符串模式匹配算法.zip

    即从 j=0 起比较 S[i+j] 与 T[j],若相等,则在主串 S 中存在以 i 为起始位置匹配成功的可能性,继续往后比较( j逐步增1 ),直至与T串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配...

    JavaScript经典实例

     1.8插入特殊字符  1.9处理textarea的单个行  1.10去除字符串末尾的空白  1.11左补充或右补充一个字符串  第2章使用正则表达式  2.0简介  2.1测试一个子字符串是否存在  2.2测试不区分大小写的子字符串匹配 ...

    javascript 实现输入多行动态输入

    这里我又去看书(servlet 和 JSP 核心编程,极好的一本书,该讲的都讲了,读明白了它servlet/JSP也就可以说精通了)p70页里面:getParameterValues()返回字符串数组,然后我们用循环判断这个字符串数组的长度,再就是获得值...

    c语言程序设计标准教程

    表示NAME是字符数组类型,数组长度为20。 然后可用NAME 说明变量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20] 又如: typedef struct stu{ char name[20]; int age; char sex; } STU; ...

    c/c++ 学习总结 初学者必备

     上面我们见到的\x,\n,\a等等都是叫转义字符,它告诉编译器需要用特殊的方式进行处理。下面给出所有的转义字符和所对应的意义:  转义字符 描述  \' 单引号  \ 双引号  \\ 反斜杠  \0 空字符  \ccc (最多三位...

    《javaScrip开发技术大全》源代码

    • sample21.htm 通过字符串的起始位置和结束位置来获得子字符串 • sample22.htm slice()方法的使用 • sample23.htm substr()方法的使用 • sample24.htm 查找子字符串在字符串中...

Global site tag (gtag.js) - Google Analytics