在讨论她的他特殊性之前我们先来说一下,为什么就只有字符数组不一样呢!
原因是:设计者认为如果存储的是字符数组,单单取出某个字符是没有任何意义的.所以编译器就字符串进行了特殊的处理.
下面就来看看她的特殊性都体现在哪些方面:
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:字母排序-字符数组”的主题中,我们主要关注的是如何使用C语言来处理字符数组,特别是对字母进行排序。C语言是一种底层编程语言,它提供了直接操作内存和数据结构的能力,因此非常适合这样的...
### C语言字符数组初始化详解 #### 一、字符数组的定义与初始化 在C语言中,字符数组是一种存储字符序列的数据结构,它允许程序员通过数组的形式来存储和操作字符串。字符数组的初始化是指在声明数组时为其分配...
字符数组本质上是数组的一种特殊形式,专门用于存放一系列的字符。以下是对字符数组的一些关键知识点的详细解释: 1. **字符数组的定义**: 类似于其他类型的数组,字符数组可以定义为`char c[数组长度]`。例如,`...
换句话说,字符串是特殊形式的字符数组,它的最后一个字符必须是NULL,这个特殊的字符在ASCII码表中位于第一位,用16进制表示为0x00。 在C语言中,字符数组的长度是固定的,这意味着在声明时就需要指定大小。例如,...
字符数组常用于存储字符串,因为C语言将字符串视为字符数组的特殊形式。字符串的结束标志是空字符 '\0'。例如,`char str[10] = "Hello"` 创建了一个包含5个字符(不包括结束符)的字符串。字符串处理函数如`strlen...
2. **字符数组与字符串**:字符数组用于存储字符串,字符串在C语言中是以空字符('\0')结尾的字符序列。理解字符数组与普通数组的区别,如字符串不可变性,以及掌握字符串处理函数,如`strlen()`、`strcpy()`、`...
字符串在MATLAB中是一种特殊类型的数组,它由单一字符组成。在MATLAB R2016b及以后的版本中,字符串被作为第一类公民对待,有自己的数据类型。在【例3.1-1】中,我们看到数值变量`a`和字符串变量`b`的区别。`a`是一...
总之,解决“Base-64 字符数组的无效长度”问题的关键在于理解Base64编码的细节以及不同平台间的兼容性问题。在Android与C#之间进行Base64字符串传递时,确保正确的字符编码和解码策略,可以避免这类问题的发生,...
在MATLAB中,除了数值数组,还有三种特殊的数据类型,分别是字符串数组、元胞数组和构架数组。这些数据类型提供了处理不同类型和大小数据的能力,增强了MATLAB在处理复杂问题时的灵活性。 **字符串数组**在MATLAB中...
- 在C语言中,字符串实际上是一种特殊的字符数组,其特征是数组的末尾有一个结束符`\0`。例如,字符串"I am happy"在内存中实际上是`{'I',' ','a','m',' ','h','a','p','p','y','\0'}`。 - 当用字符串常量初始化...
在C++编程语言中,字符数组是存储字符串的基础数据结构。字符数组本质上是一个可以容纳多个字符的数组,每个字符在内存中占据一个字节。本文将深入探讨字符数组的输入输出以及字符串结束标志的使用。 首先,让我们...
Java中的数组和字符串是编程中基础且重要的概念,它们在许多场景中都有广泛的应用。数组是一种数据结构,它能够存储相同...在实际编程中,还需要注意数组越界、字符串操作性能优化等问题,以确保程序的正确性和效率。
在C语言中,字符串是字符数组的特殊形式,通常以空字符'\0'作为结束标志。因此,对字符串排序意味着对这些字符数组进行比较和重新排列。有多种排序算法可以用于字符串,比如冒泡排序、选择排序、插入排序、快速排序...
- **字符串函数** 包括基本的字符串操作,如拼接、分割、查找、替换等,以及数据数组和电子表格之间的转换函数,这些函数极大地提高了字符串处理的效率和灵活性。 **6.2 数组(Array)** 数组是存储同类型数据集合...