char 是用来存储单个字符的;
例如:
char ch=’a’;
char[]是用来存储多个字符的;
例如:
char ch[5]={‘h’, ‘e’, ‘l’, ‘l’, ‘o’};
//数组本质上就是同时定义了多个变量,并对变量进行初始化
当char[]最后一个字符为‘\0’的时候,这是一个字符串
例如:
char ch[6]={‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
字符串也可以写成:
char ch[6]=”hello”;// char ch[]=”hello”;//一般为了方便,不写数组元素个数//引号引起来的是字符串,默认结尾处有'\0'
char ch1[]=”world”;//存储在栈内存,内容可以被修改
char *ch2=”hello world”;//存储在常量区,内容不能被修改等价于const char *ch =”hello world”;
注意:ch2是一个局部指针变量,存储在栈中,而“helloworld”则是存储在常量区的。但是,ch,ch1以及其中的数组,hello,world均是存储在栈中的。
//char * 字符指针与int*相比在形式上多了这种赋值方式:
1)
int* i=&j;//赋值的是一个地址;
char ch[]=”hello world”;//ch保存了字符串首字符的地址
char* p=ch;// 字符指针指向了字符串的首字符h
*p =’T’//这样是对的,因为字符指针p指向的是一个字符变量
//这是char* 与int*的相同的地方;
2)
char* ch=”hello world”;
//char*还可以直接赋值一个字符串常量!!!这个与int*的不同之处。
//实质上”helloworld”返回的也是地址,而不是字符串常量本身。
对字符串数组进行初始化的方法有两种:
1) 定义的时候直接初始化:
char ch[]=”hello”;
2)使用字符数组的拷贝函数
char* strcpy(char *dst, const char *src);
char ch[6];
char *p=”hello”;
strcpy(ch,p);
注意:dst是已经申请的内存单元,足够大的可修改的内存区域,需能盛下src内的字符个数,并且不能是指向常量的字符串常量,所以可以是字符数组char ch[6];也可以是new的内存
char *ch= new char[6];
但是不能是
char *ch;
strcpy(ch,p);//这样会报错!!!!
总结:
1)字符指针既可以指向字符串,也可以指向某个字符变量
2)字符数组名是常量,故数组名不能++;字符指针是个变量,故指针可以++;
字符数组是变量的集合,故字符数组元素可以++;字符指针指向的是字符串常量,常量是不能++的,故(*p)++ 是错误的,相当于char *p=”hello”; h = h +1,同样,p[0]='m';也是错误的。