快捷搜索: 王者荣耀 脱发

C语言-char_*a与char_a[]的区别

目录:

一、char *a与char a[]的区别

二、C语言中数组的赋值

三、附录

-----------------------------------------------------------------------------------------------

一、char *a与char a[]的区别

char *a = "hello" 中的a是指向第一个字符‘h的一个指针;

char a[20] = "hello" 中数组名a也是执行数组第一个字符‘h’的指针。

但二者并不相同,看如下把两个字符串相加(strcat函数见附录)的实例:

结果:

对比:

结果:

把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常量区,是无法修改的。而数组是存放在栈中,是可以修改的。两者区别如下:

1、读写能力

char *a = "abcd"; //"abcd"存放在常量存储区,通过指针只可以访问字符串常量,而不可以改变它

char a[20] = "abcd"; //"abcd"存放在栈,可以通过指针去访问和修改数组内容

2、赋值时刻

char *a = "abcd"; //在编译时就确定了(因为是常量)

char a[20] = "abcd"; //在运行时确定

3、存取效率

char *a = "abcd"; //存于常量存储区,在栈上的数组比指针所指向字符串快,因此慢

char a[20] = "abcd"; //存于栈上,因此快

4、另外注意:

1)char a[] = "01234",虽然没有指明字符串的长度,但是此时系统已经开辟好了,就是大小为6(0 1 2 3 4 5 )。

2)另外注意strlen(a)是不计‘’。

注:内存分配方式详见/16、堆、栈、存储区

-----------------------------------------------------------------------------------------------

二、C语言中数组的赋值

如果已声明某变量如a为数组(比如char数组),则不能用=号给它赋值(除了初始化之外)!也就是说除了初始化,再不能将数组放在=号左边!

若想对char数组另外赋值见下两例:

1、自己将数组中的内容赋值

因为 char *s="hello"; 就等于声明了s[]=="hello";

2、使用string.h标准库中的函数:strcpy

#include "stdio.h"

#include "string.h"

int main()

{

char *s="hello";

char a[10]={"0"};

strcpy(a,s); //拷贝s字符串到a中

return 0;

}

-----------------------------------------------------------------------------------------------

三、附录

strcat原型:extern char *strcat(char *dest, const char *src);

strcat功能:将两个char类型连接,src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。

-----------------------------------------------------------------------------------------------

经验分享 程序员 微信小程序 职场和发展