转自:https://blog.youkuaiyun.com/modi000/article/details/80691726
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"; //一般为了方便,不写数组元素个数
char ch[] = "hello world"; //存储在栈内存,内容可以被修改???
char *ch = "helloworld"; //存储在常量区,内容不能被修改等价于const char *ch = "hello world";???
//char * 字符指针与int * 相比在形式上多了这种赋值方式:
#include <stdio.h>
int main(int argc,char *argv[]){
int j = 10;
int *i= &j;//赋值的是一个地址
printf("%d\n",*i);
char ch[]= "hello world!";//ch保存了字符串首字符的地址
char *p = ch;//字符指针指向了字符串的首字符h
*p = 'T';//这样是对的,因为字符指针p指向的是一个字符变量
ch[1] = 'o';
ch[2] = 'u';
ch[3] = 'c';
ch[4] = 'h';
printf("%s\n",ch);
return 0;
}
结果:
10
Touch world!
//这是char* 与int* 的相同的地方
2)
#include <stdio.h>
int main(int argc,char *argv[]){
char *ch = "hello world!";
printf("%s\n",ch);
return 0;
}
//char * 还可以直接赋值一个字符串常量!!!这个与int * 的不同之处。
//实质上"helloworld"返回的也是地址,而不是字符串常量本身。
对字符串数组进行初始化的方法有两种:
1) 定义的时候直接初始化:
char ch[]= "hello";
2)使用字符数组的拷贝函数
char* strcpy(char *dst, const char *src);
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]){
char ch[6] = {0};
printf("%s\n",ch);
char *p = "hello";
strcpy(ch,p);
printf("%s\n",ch);
return 0;
}
注意:dst是已经申请的内存单元,足够大的可修改的内存区域,
需能盛下src内的字符个数,并且不能是指向常量的字符串常量,
所以可以是字符数组char ch[6];也可以是new的内存
char *ch = new char[6];
但是不能是
char *ch;
strcpy(ch,p);//这样会报错!!!!
总结:
1)字符指针既可以指向字符串,也可以指向某个字符变量
2)字符数组名是常量,故数组名不能++;字符指针是个变量,故指针可以++;
字符数组是变量的集合,故字符数组元素可以++;字符指针指向的是字符串常量,常量是不能++的,故*p++是错误的。
作者:modi000
来源:优快云
原文:https://blog.youkuaiyun.com/modi000/article/details/80691726
版权声明:本文为博主原创文章,转载请附上博文链接!