概述
数组和字符串
string.h 包含 memcpy、memset
从int数组a复制k个元素到int数组b:memcpy(b,a,sizeof(int)*k)
把数组a全部复制到数组b中:memcpy(b,a,sizeof(a))
把数组a清零:memset(a,0,sizeof(a))
字符串:
char s[] = "aasdsa123"; or char *s = "asdasdasd123";
字符数组:
char s[7] = {'0','1','2','a'}; (7可以省略)
数组
const char rev[] = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char msg[4][30]= {"not a palindrome",//不是回文词
"a regular pelindrome",//是回文词
"a mirrored string",//镜像串
"a mirrored palindrome"};//回文镜像串
指针
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[] = {"not a palindrome",//不是回文词
"a regular pelindrome",//是回文词
"a mirrored string",//镜像串
"a mirrored palindrome"};//回文镜像串
const char *s = {"A 3 HIL JM O 2TUVWXY51SE 2 8 "};
printf("%d",sizeof(s));
输出结果:8
const char s[] = {"A 3 HIL JM O 2TUVWXY51SE 2 8 "};
printf("%d",sizeof(s));
printf("%d",strlen(s));
printf("%c",s[33]);
printf("%d",s[33]);
输出结果:36
35
8
56
%c只能输出或输入一个字符,%s输出的是一串字符。此外,char a; string s;输入的时候scanf(“%c”, &a);这里的&不能少,而
scanf(“%s”,s);这里不能有&符号
。char *s定义了一个char型的指针,
它只知道所指向的内存单元,并不知道这个内存单元有多大
,所以:当char *s = "hello";后,不能使用s[0]='a'
;当用char s[]=”hello”;后,完全可以使用s[0]=’a’;进行赋值,这是常规的数组操作。C语言中定义一个变量时可以初始化。char str[10] = {“hello world”};
当编译器遇到这句时,会把str数组中从第一个元素把hello world 逐个填入
。C语言中规定
数组代表数组所在内存位置的首地址
,也是 str[0]的地址,即str = &str[0]
。在C语言中
字符串常量的本质表示其实是一个地址(第一个字符的地址)
举例:char *s ;
s = “China”;
为什么可以把一个字符串赋给一个指针变量,这不是类型不一致吗???
C语言中编译器会给字符串常量分配地址,如果 “China”, 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005。s = “China” ,意识是什么,对了,地址。其实真正的意义是s ="China" = 0x3000
;
看清楚了吧 ,你把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质表现是代表它的第一个字符的地址
。s = 0x3000 这样写似乎更符合直观的意思。而printf("%s",str)
,原理是通过字符串首地址输出字符串。
char * 与 char a[ ]
- 前面说到a代表字符串的首地址,而s这个指针也保存字符串的地址(其实首地址),即第一个字符的地址,这个地址单元中的数据是一个字符,这也与 s 所指向的 char 一致。
因此可以 s = a;但是不能 a = s
;C语言中数组名可以复制给指针表示地址,但是却不能赋给给数组名,它是一个常量类型,所以不能修改。 - 字符指针可以用间接操作符 *取其内容,也可以用数组的下标形式 [ ],数组名也可以用 *操作,因为它本身表示一个地址 。比如 char a [ ] = “hello”; printf(“%c”,*a); 将会打印出 ‘h’。
char * 与 char a[ ] 的本质区别:
- 当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符,sizeof(a) = 10 。
而定义 char *s 时,这是个指针变量,只占四个字节,sizeof(s) = 4,32位,用来保存一个地址。
- printf(“%p”,s); 表示 s 的单元中所保存的地址。
printf(“%p”,&s); 表示变量本身所在内存单元地址。
用一句话来概括,就是 char *s 只是一个保存字符串首地址的指针变量
,char a[ ] 是许多连续的内存单元,单元中的元素为char
,之所以用 char *能达到char a [ ] 的效果,还是字符串的本质,地址,即给你一个字符串地址,便可以随心所欲的操所他。但是char* 和 char a[ ] 的本质属性是不一样的。
最后
以上就是愤怒大米为你收集整理的c语言 数组和字符串的全部内容,希望文章能够帮你解决c语言 数组和字符串所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复