【王道 c语言笔记-初级-4.一维数组与字符数组】

一维数组

我们可以借助C语言提供的数组,通过一个符号访问多个元素。数组指一组具有相同数据类型的数据的有序集合。
一维数组的定义格式

类型说明符 数组名[常量表达式];
int a[10]

声明数组时要遵循以下规则:
(1) 数组名的命名规则和变量名的相同,即遵循标识符命名规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。
(3) 常量表达式中可以包含常量和符号常量,但不能包含变量。也就是说,C 语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值。

错误

一维数组在内存中的存储

int mark[100];

整型元素,占用4字节,数组元素的引用方式是“数组名[下标]”,所以访问数组 mark 中的元素的方式是 mark[o],mark[1],…,mark[99]。注意,没有元素 mark[100],因为数组元素是从0开始编号的
数组
(1) 在定义数组时对数组元素赋初值。例如,

int a[10]={0,1,2,3,4,5,6,7,8,9};

不能写成

int a[10];a[10]={0,1,2,3,4,5,6,7,8,9};

(2) 可以只给一部分元素赋值。例如,

int a[10]={0,1,2,3,4};

定义a 数组有 10 个元素,但花括号内只提供 5 个初值,这表示只给前5个元素赋初值,后5个元素的值为 0
(3) 如果要使一个数组中全部元素的值为 0,那么可以写为

int a[10]={0,0,0,0,0,0,0,0,0,0};

int a[10]={0};

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度例如,

int a[]={1,2,3,4,5};

数组的访问越界与数组传递

数组的访问越界

操作系统对内存中的每个位置也给予一个编号,对于 Windows 32 位控制台应用序来说,这个编号的范围是从0x00 00 00 00到XFF FF FF FF,总计为2的32 次方,大小4G。这些编号称为地址(我们是 64 位程序,地址显示的是 64 位)。
数组越界

**数组另一个值得关注的地方是,编译器并不检查程序对数组下标的引用是否在数组的合法范围内。**这种不加检查的行为有好处也有坏处,好处是不需要浪费时间对有些已知正确的数组下标进行检查,坏处是这样做将无法检测出无效的下标引用。一个良好的经验法则是: 如果下标值
是通过那些已知正确的值计算得来的,那么就无须检查;如果下标值是由用户输入的数据产生的那么在使用它们之前就必须进行检查,以确保它们位于有效范围内。

数组的传递

数组传递

一维数组在传递时,其长度是传递不过去的,所以我们通过len来传递数组中的元素个数。实际数组名中存储的是数组的首地址,在调用函数传递时,是将数组的首地址给了变量b(其实变量 b 是指针类型),在 b[]的方括号中填写任何数子都是没有意义的。这时我们在 print 函数内修改元素 b[4]=20,可以看到数组b的起始地址和 main 函数中数组 a 的起始地址相同,即二者在内存中位于同一位置,当函数执行结束时,数组 a 中的元素 a[4]就得到了修改。

字符数组与scanf读取字符串

字符数组初始化及传递

宁符数组的定义方法与前面介绍的一维数组类似。例如

char c[10];

宁符数组的初始化可以采用以下方式
(1) 对每个字符单独赋值进行初始化。例如

c[O]='I';c[1]=' ';c[2]='a';c[3]='m';c[4]='';c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';

(2) 对整个数组进行初始化。例如

char c[10]=['I','a','m', 'h','a','p','p','y'];

字符数组一般用来存取字符串。通常采用的初始化方式是

char c[10]="hello"

。因为 C 语言规定字符串的结束标志为"0,而系统会对宁符中常量自动加一个"0,为了保证处理方法一致,一般会人为地在宁符数组中添加"O,所以字符数组存储的字符串长度必须比字符数组少 1字节。例如,char c10]最长存储 9 个字符,剩余的1个宁符用来存储’\0’;

scanf读取字符串

scanf字符
scanf 通过%s 读取字符串,对 c和d 分别输人"are"和"you”(中间加一个空格) ,scanf在使用%s 读取字符串时,会忽略空格和回车 (这一点与%d 和%f类似)

gets与puts函数,str字符串操作函数

gets 函数类似于 scanf 函数,用于读取标准输人。scanf 函数在读取宁符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用 gets 函数进行读取。
gets 函数的格式如下:

char *gets(char *str);

gets 函数从 STDIN (标准输入) 读取字符并把它们加载到 str (字符串) 中,直到遇到换行符 \n 。如下例所示,执行后,我们输人"how are you",共 11 个字符,可以看到 gets 会读取空格,同时可以看到我们并未给数组进行初始化赋值,但是最后有’\0’,这是因为 gets 遇到\n 后,不会存储\n,而是将其翻译为空字符’\0’。
puts 函数类似于 printf 函数,用于输出标准输出。puts 函数的格式如下:

int puts(char *str);

函数 puts 把 str (字符串) 写人 STDOU (标准输出),puts 会将数组c 中存储的"how are you"字符串打印到屏幕上,同时打印换行,相对于 printf 函数,puts 只能用于输出宁符串,同时多打印一个换行符,等价于 printf(“%s\n”,c);
gets*puts

str系列字符串操作函数

str 系列宁符串操作函数主要包括 strlen、strcpy、strcmp、strcat 等。strlen 函数用于统计宁符串长度,strcpy 函数用于将某个宁符串复制到宁符数组中(目标数组一定要大于字符串大小),strcmp 函数用于比较两个宁符串的大小(从头开始比较ASCII码值),strcat 函数用于将两个宁符串连接到一起(目标数组一定要大于字符串大小)。各个函数的具体格式如下所示:

#include <string.h>
size_t strlen(char *str);
char *strcpy(char *to, const char *from);
int strcmp(const char *str1, const char *str2);
char *strcat(char *str1, const char *str2);

对于传参类型 char*,直接放入字符数组的数组名即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值