1.定义:
字符定义:
char ch='A';//定义单个字符
字符串定义:
char* s;
s = "abcd";
char* s = { "abcd" };
char* s = "abcd";
注意:char *s;s={"abcd"};这种赋值方式是错误的,
字符数组定义:
char arr[] = "abcd";//这种方式定义时必须初始化
char arr1[5] = { "abcd" };
char arr2[5] = { 'a','b','c','d' };//以上两种方式定义时必须考虑‘\0'的存放
/*char s[7]; s="abcdef";这种方式赋值是错误的,因为s本质是一个数组,
只能逐个赋值,如是s[0]='a';s[1]='b';*/
/*char s[7];s[7] = "abcde";
这种方式也错误,是s[7]是数组最后一个元素,不能将字符串赋值给他*/
//定义了一个两行三列的字符数组,其中每一行均可以看成是两个元素的一维数组
char s[2][3] = { {"ab"},{"cd"} };
printf("%s\n", s[0]);//输出结果为 ab
//二维数组的初始化
char s1[3][8] = { {"apple"},{"orange"},{"banana"} };
//等价于
char s2[3][8] = {"apple","orange","banana"};
2.字符串的长度
(1)sizeof(arr)是求字符串所占空间大小,包括了'\0',对于字符数组,sizeof返回的是该数组定义时开辟的空间大小,如char c[3][4];sizeof(c)=12;另外,sizeof是一个操作符,并不是一个函数,如int a;sizeof(a)=sizeof a=4;
(2) strlen(arr)返回的是数组的实际长度,不包括'\0'。
3.字符串与字符数组的区别
char arr1[] = "abc";
char arr2[] = "abc";
printf("arr1的地址%p\n",arr1);
printf("arr2的地址%p\n", arr2);
char* s1 = "abc";
char* s2 = "abc";
printf("s1的地址%p\n", s1);
printf("s2的地址%p\n", s2);
可以发现,arr1与arr2的地址不相同,s1与s2的地址相同,这是编译器自动做的优化,节省内存空间
区别一:定义不一样
1、字符串指针变量本身是一个变量,用于存放字符串的首地址。字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘�’作为串的结束。
2、字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
区别二:对字符串指针方式不同
1、char *ps=”C Language”;可以写成char *ps;ps=”C Language”;
2、数组方式char st[]={”C Language”};不能写成char st[20];
St={”C Language”};只能对字符数组的各元素逐个赋值。
#include<iostream>
using namespace std;
int main(){
//没有存储结束符的话就不是字符串,就是一个字符数组(单纯的字符数组)
//字符数组
char a[3]={'1','2','3'} ;
//字符串
char a[3]={'1','2','\0'} ;
return 0;
}