字符数组是一种数组,这中数组中的每一个元素是一个字符型数据。数组
定义一个字符数组:函数
char ch[5];
对已定义的字符数组进行赋值:spa
ch[0] = 'h'; ch[1] = 'e'; ch[2] = 'l'; ch[3] = 'l'; ch[4] = 'o';
以上字符素组的存储为:指针
字符数组的初始化有两种方式:code
char ch[5] = {'h','e','l','l','o'}; 或者 char ch[] = {'h','e','l','l','o'};
字符串与字符数组的区别在于,字符串在有效的字符后面添加一个结束标志‘\0’。内存
'\0'字符的ASCII码是0,系统在检测到该字符的时候就认为字符串已经结束了。字符串
#include <stdio.h> int main(void) { char ch[] = {'h','e','l','l','o','\0'}; //字符串初始化 printf("%s\n", ch); ch[3] = '\0'; //将第4个元素改为结束符 printf("%s\n", ch); return 0; }
运行结果为:io
上面的实例说明,printf()函数在打印字符串的时候并不检测字符数组的大小,而是检测须要打印的字符串是否有'\0'的结束标志。C语言中和字符串有关的库函数都是以遇到'\0'为字符串操做结束标志的。class
对一个字符串的初始化有两种方式:程序
char str[] = {"hello"}; 或 char str[] = “hello”;
须要注意的是字符串会添加一个结束符'\0'在字符串的结尾。
在C语言中使用两个双引号括起来的内容是一个字符串的常量,以下:
char *p = "hello world";
因为一个字符串常量的值自己不会改变,所以这种字符串常量存储在一个只读的数据段中,任未尝试对该数据段的修改都是不容许的,也能够使用下面的方式定义字符串:
char str[] = "hello";
这种字符串是能够修改的,这种定义实际上将存储在制度数据段中的字符串的内容复制到了字符数组的空间中,所以这种方式等价于:
char *p = "hello"; char str[6]; strcpy(str, p);
来看下面的程序:
#include <stdio.h> int main(void) { char *str1 = "hello"; //字符串 char str2[] = "hello"; //字符数组 char *str3 = "hello"; //字符串 if(str1 == str2) printf("1 OK\n"); if(str1 == str3) printf("2 OK\n"); return 0; }
运行结果为:
缘由是str1和str3指向同一个字符串常量,而该常量存储在只读数据段中,这时两个指针实际上指向同一块内存区域,所以指针的值是相等的。
而对于str2和str1来讲,所指向的存储空间的位置是不一样的。str2是一个数组名,该数组存储在栈上。而str1所指向的空间存储在只读数据段上,由此可知两个指针谁不相等的。