数组:
由若干个相同类型 的相关数据项,按顺序存储在一起 ,构成的数组;数组其实是同种类型,有序的数据的集合。
数组名:
用统一的名字命名标识这组数据,这个名字就是数组名。
数组元素:
构成数组的每一个数据项称为数组的元素
格式:
类型 数组名[ 下标 ][ 下标 ]…; 其中:类型是数组元素的基类型,就是每个元素的类型。
数组分类:
常用的一维数组,二维数组
一维数组:
格式:
类型 数组名[ 常数表达式 ]; int a[10];//个元素都是整数
元素是 a[0],a[1], a[2],…a[9]。
**说明:**一维数组元素在内存中的排列顺序是线性排列,就是连续存储。
引用:
C语言规定只能逐个引用数组元素,而不能一次引用整个数组。
引用形式:
数组名 [ 下标 ]
其中数组在引用时其下标必须要落在0到n-1的范围内,不然会出现越界,系统不对越界做检查,需要程序员自己检查。其实一个数组元素就是一个变量名,和变量一样使用。
一维数组初始化:
在定义数组时可以给数组初始化:
可全部初始化
也可以部分初始化
在对全部数组元素进行赋值时,可以不指定数组长度
当数组被说明为静态(static)存储类型或者外部存储类型(在所有函数外部定义)时,则在不显示给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。下图
二维数组:
格式:
类型 数组名[ 常数表达式 ] [ 常数表达式 ]; 下图
元素是按行存储
**引用:**数组名 [ 下标 ][ 下标 ], 下标可为整型也可以是常数表达式,
每个数组元素也是一个变量,可以当变量使用。
如果对全部元素赋初值,则定义数据时对第一维长度可以不指定,但是第二维长度不能不写。
一维数组名作为函数参数:
使用简单变量作函数参数,能由实参向形参传递一个数据。但是使用数组名作为函数参数,属于“地址调用”能从主调函数向被调函数传递数组的首地址,并能由被调函数向主调函数传递多个数据。
传递方式:属于赋地址调用,将实参数组首地址传给虚参,虚参也是一个数组名。
虚参要求:必须是数组名
实参要求:可为凌一个数组名
虚实结合:实参和虚参有相同的首地址,虚参改变整个地址内的内容后,实参内容也在变。
函数传递示意图:
但从传值上面来说,还是单方向传递的,只能从实参传递给虚参,虚参不可以再传给实参。
二维数组名作为函数参数
#include <stdio.h>
#define ROW 2 //二维数组的行数
#define COL 2 //二维数组的列数
//4个版本的求和函数
//方式一:数组形式
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col);
//方式二:指针形式,prArray是一个指向包含COL个int的数组的指针
int TwoDimArraySum2(int (*prArray)[COL], int row, int col);
//方式三:指针形式,pr是一个指向int的指针
int TwoDimArraySum3(int *pr, int row, int col);
//方式四:变长数组(C99开始支持)
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col]);
int main(void)
{
int twoDimArray[ROW][COL] = {{-2, 5}, {4, 9}};
int result;
//方式一
result = TwoDimArraySum1(twoDimArray, ROW, COL);
printf("Sum1函数结果:%d\n", result);
//方式二
result = TwoDimArraySum2(twoDimArray, ROW, COL);
printf("Sum2函数结果:%d\n", result);
//方式三
result = TwoDimArraySum3(twoDimArray[0], ROW, COL);
printf("Sum3函数结果:%d\n", result);
//方式四
result = TwoDimArraySum4(ROW, COL, twoDimArray);
printf("Sum4函数结果:%d\n", result);
return 0;
}
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col)
{
int i, j;
int result = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//下面两种寻址方式都行
result += twoDimAr[i][j];
// result += *(*(twoDimAr + i) + j);
}
}
return result;
}
int TwoDimArraySum2(int (*prArray)[COL], int row, int col)
{
int i, j;
int result = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//下面两种寻址方式都行
result += prArray[i][j];
// result += *(*(prArray + i) + j);
}
}
return result;
}
int TwoDimArraySum3(int *pr, int row, int col)
{
int i, j;
int result = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//下面两种寻址方式都行
result += pr[i*col + j];
// result += *(Pr + i*col + j);
}
}
return result;
}
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col])
{
int i, j;
int result = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//下面两种寻址方式都行
result += twoDimAr[i][j];
// result += *(*(prArray + i) + j);
}
}
return result;
}
字符数组的定义:
**格式:**char 数组名 [ 常数 ] [ 常数 ]…; 字符数组初始化:
字符数组的引用:
引用字符数组中的一个元素,就是得到一个字符。
C语言中没有字符串数据类型,C语言是将字符串作为字符数组处理。
字符数组和字符串的关系:
字符串输入:
这里scanf遇到空格会将认为是结束。后面的数据就丢失了
字符串输出:
这里字符串的长度是6,不是5 ,还有一个’\0’,在最后,是系统自动加的,因为这是字符串结束的标志。
字符串处理函数:
下面这些函数都有标准库函数都在<string.h>里面。
字符串连接函数-------strcat
字符串复制函数--------strcpy()
字符串比较函数------strcmp
注意:这里比较是对应元素比较,一方大于另一方就比较完了,不是按长度比较。
字符串长度函数------strlen
这里和siaeof运算符不一样,这里不计算’\0’,sixeof计算’\0’.
字符串小写函数-----strlwr
字符串大写函数-----strupr