目录:
一、char *a与char a[ ]的区别
二、C语言中数组的赋值
1、自己将数组中的内容赋值
2、使用string.h标准库中的函数:strcpy
三、附录
一、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' '\0')。
2)另外注意strlen(a)是不计‘\0’。
注:内存分配方式详见C语言使用相关汇总2之16、堆、栈、存储区。
二、C语言中数组的赋值
若已声明某变量如a为数组(比如char数组),则不能用=号给它赋值(除了初始化之外)!也就是说除了初始化,再不能将数组放在=号左边!若想对char数组另外赋值见下两例:
1、自己将数组中的内容赋值
#include "stdio.h"
void main(void)
{
char *s="hello";
char a[10]={"0"};
int i;
for(i=0;i<strlen(s);i++)
a[i] = s[i];
printf("%s\n",a);
}
因为 char *s="hello"; 就等于声明了s[] == "hello";
2、使用string.h标准库中的函数:strcpy
#include "stdio.h"
#include "string.h"
int main(void)
{
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的指针。
无知(没有认知)从某种意义来说是一种罪,盲目的努力也是在消耗生命,资源、选择与方法比努力更为重要。觉得不错,动动发财的小手点个赞哦!