C语言学习易错点总结(四)---数组

本文深入讲解C语言中的一维和二维数组使用方法,包括数组的定义、初始化、字符数组的输入输出,以及字符串处理函数如puts、gets、strcat、strcpy、strcmp和strlen的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

一维数组

不能在方括号中用变量来表示元素的个数,但是可以使符号常数或常量表达式。例如:

#define FD 5
int a[3+2],b[7+FD];//是合法的

二维数组

如果对全部元素赋初值,第一维的长度可以不给出。

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

字符数组

char c[]={'c',' ','p','r','o','g','r','a','m' };
char c[]="c program";//字符串比上面的方式实际多占一个字节

字符数组的输入输出

char c[]="BASIC\ndBASE";
printf("%s\n",c);//因为是%s,所以不能写为c[]
char st[15];
scanf("%s",st);//输入的字符串长度必须小于15,不能有空格,否则将以空格作为串的结束符
printf("%s\n",st);

在输入的时,不需要再加&符号,因为数组名字就代表地址

字符串处理函数

字符串处理函数必须包含"string.h"

puts

格式:puts(字符数组名)
功能:输出字符串
一般可由printf函数代替

gets

格式:gets(字符数组名)
功能:从键盘上输入一个字符串
gets函数不以空格为输入结束的标志,只以回车为输入结束

strcat

格式:strcat(字符数组名1,字符数组名2)
功能:将字符数组2中的字符串连接到字符数组1后面去,并删去字符串1后面的“\0”。

strcpy

格式: strcpy(字符数组名1,字符数组名2)
功能:把字符数组2的字符串拷贝到字符数组1中

strcmp

格式:strcmp(字符数组名1,字符数组名2)
功能:按照ASCII码比较两个数组的字符串

strlen

格式:strlen(字符数组名)
功能:测字符串实际长度(不包含结束标志)

### C语言数组作为参数传递时常见错误及解决方法 #### 错误一:混淆数组指针与指针数组 对于二维数组的函数传参,如果定义为 `void test(int (*arr)[5])` 是正确的写法[^1]。这表示一个指向含有五个整数的一维数组的指针。然而,当尝试使用 `void test(int* arr[5])` 或者 `void test(int **arr)` 时,则会出现问题。这两种方式实际上声明了一个由五个指针组成的数组或者是二级指针,而不是预期中的二维数组。 #### 解决方案: 应始终确保所使用的语法能够准确表达目标数据结构。针对上述例子,应当采用如下形式来接收二维数组: ```c // 定义接受固定列宽的二维数组的方法 void correctTestFunction(int rows, int cols, int array[][cols]) { // 处理逻辑... } ``` #### 错误二:忽视数组退化特性 在C语言里,当我们将数组名当作参数传递给函数的时候,默认情况下它会被视为指向该类型元素的第一个位置的一个指针。这意味着即使原先是多维数组,在传递过程中也会失去维度信息变成单一类型的指针。比如,如果我们试图仅用 `int *p` 来代表一个多维矩阵的话,那么就无法得知每一行的具体长度了。 #### 解决方案: 为了保持完整的尺寸信息,可以在函数签名处指定额外的信息,如每行列数;或者利用动态分配的方式构建更灵活的数据容器,并通过辅助变量携带必要的元数据一同传输过去。 #### 错误三:误解形参与实参之间的关系 尽管提到过实际参数会赋值给形式参数,但这并不意味着二者共享同一片存储区域——它们各自拥有独立的空间[^2]。因此修改其中一个不会直接影响另一个的内容。不过需要注意的是,由于是指向相同对象的不同别名,所以间接操作(例如解引用)确实会影响原始数据。 #### 解决方案: 理解并区分好这两者的区别非常重要。如果你希望改变外部作用域内的某个局部变量的状态,就需要考虑返回新值或是采取地址传递的方式来实现双向通信机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值