C语言字符数组与字符串

2018-12-08 10:55:00
六月
转贴:
https://www.cnblogs.com/ranjiewen/articles/6833074.html
761

char a[10];
1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如
 char a[10];
 a[10]="hello";
这样是错误的!

2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};

3、利用strcpy
char a[10];
strcpy(a, "hello");

易错情况:
1、char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

还有:不能使用关系运算符“==”来比较两个字符串, 只能用strcmp() 函数来处理。


归纳总结一:

参考网络知识和《c和指针》中关于字符数组的初始化部分

(注意:需要提前搞清楚,什么是赋值,什么是初始化,什么是定义。相关知识可以参考网络资料,

eg:int a;(定义),

int a = 10;(初始化),

a = 10;(赋值))

1.对于字符数组:

char a[15] = “abcdef”;

但不能做如下操作

char a[15];

a[15] = “abcdef”;

特别注意:第一种初始化的方式,看似左值是个字符串,其实不然,它其实是个初始化列表。最后列表包含因此, 字符数组是不能将字符串赋给它的!

所以在后续的赋值里必须对数组元素进行赋值

2.对于字符串

char *p = “abcdef”;

注意这里不是把一个字符串赋给了一个字符型的指针,而是把一个字符型的指针指向了字符串的首地址。

所以上面p = "z"只是把指针指向了另一个地方而已

3 .对于数组与字符串在机器中的存储

数组:数组在机器中,当被定义时

eg:char a[10];就已经分配好了内存空间,放在了数据段中,其中的数值是可以进行修改的

字符串字符串在内存中也被存放在了数据段中,但是字符串又称为字符串常量,是编译器“钉死”无法修改的,所以*p = 'z';想改变字符串的值是不被允许的

之后我又进行了一些尝试,那就是将数组作为一个函数的参数进行传递,看变换,这个知识点,我不做操作上的过多复述。

归纳总结二:

在此之前,我们首先得理解,数组名。数组名表示着这个数组的入口地址,这一点与函数名,结构体标识等类似。

eg:char a[10];那么 a表示的是这个数组第一个元素的地址,即&a[0]; 而&a;表示的是这个数组的首地址

估计不少人这个时候糊涂了,这两个有区别吗?数值不一样么?

它们两个的数值是一样的,因为地址只有一个,数组的一个元素的地址的值就是这个数组的地址的值,那么为什么还要分这么细致呢?下面举个例子

eg:

char a[10];

char *p = NULL;

char (*p_a)[10] = NULL;

p = a;

p_a = &a;

如上面这个例子,a只能赋给一个char型的指针,而&a只能赋给一个指向一个数组的指针(注意这里的这个数组要与你定义的那个a数组同大小)

借助指针,我们不难理解,其实他们所代表的一个指针的类型是截然不同的(如果不能理解请参考c相关教程中指针的概念)

进入正文,所以当一个数组被传递如函数的时候可以把数组名传进去,也就是把这个数组的第一个元素的首地址传进去

作为指针被传进去的数组名这时和指针是完全一致的,可以作为指针使用,当然为直观化,可以用做数组

eg:

char a[10];

int fun(char *a)

{

  a[0] = ‘A’;

}

至于程序中出现的指针的指针只是在思考时做的讨论,上面的那么其实也可以看做普通指针,这里不做过多说明。

发表评论
评论通过审核后显示。
文章分类
联系我们
联系人: 刘亚军
电话: 1370***0996
Email: liuyajune-1#126.com
QQ: 441417992-1
微信: liuyajune
微博: liuyajune
地址: 浙江省台州市椒江区中心大道