------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、数组
1.数组概述
1> 数组是什么?
数组就是一些数据或变量的按照一定顺序排列的一个集合
2> 数组是一个统称, 里面的每一个具体的变量称为元素
3> 数组中每一个变量的位置是确定, 使用从 0 开始的序号进行访问
这个需要称为"下标"或"索引"
4> 一维数组
如果有一个数组, 而数组中每一个元素都是一个简单的数据类型, 即不是一个数组
那么就称该数组为一维数组
5> 在 C 语言中不直接支持 二维数组
而是利用一个元素为 一维数组 的 "一维数组" 来描述二维数组
2. 如何声明数组
语法:
数据类型 数组名 [ 元素个数 ];
1) 数据类型, 表示数组元素的类型是什么, 一个数组只允许存储一种数据类型的多个变量
2) 数组名就是标识符
3) 元素个数不允许是浮点数, 必须是整数或整数表达式
ANSI C 不允许个数是变量, C99 中允许使用变量
3. 如何使用数组
所谓的使用数组就是往数组中存储数据, 和取出数据
(重要)定义一个数组与定义多个变量在使用上是完全一样的
, 对数组元素的初始化
1> 先定义再初始化
int nums[2];
nums[0] = 1;
nums[1] = 23;
2> 定义数组的同时进行初始化
int nums[2] = { 1, 2 };
3>补充: 数组的初始化方式很多
不完全初始化, 没有初始化的变量默认为 0
int nums[10] = { 1, 2 };
省略数组元素个数, 编译器会根据初始化使用的数据个数类自动的提供元素个数
int nums[] = { 1, 2, 3, 4 };
5.使用数组中的元素
> 1 使用其中的某一个变量
数组名[下标]
2> 遍历, 所谓的遍历就是将数组元素一个一个取出来使用
//数组的遍历
#include
int main(int argc, const char * argv[]) {
int array[] = { 1, 2, 33, 44, 555 ,6666 , 777};
for (int i = 0; i < 7; i++) {
printf("%d\n", array[i]);
}
return 0;
}
3>sizeof 计算数组的字节数
int arr1[] = {1, 2, 3};
printf("%lu\n", sizeof(arr1));
6.使用数组实现栈结构
int main1(int argc, const char * argv[]) {
int stack[6];
int length = 0;
// 存数据
// 语法: stack[length++] = 值;
stack[length++] = 1;
stack[length++] = 2;
stack[length++] = 3;
stack[length++] = 4;
stack[length++] = 5;
// 默认的规则
// length 表示数组的长度, length 不涉及的位置里面的数据就是垃圾数据
// 所谓的后出使用语法
// stack[--length]
// 来取值
while (length > 0) {
printf("取出一个数据: %d\n", stack[--length]);
}
return 0;
}
7.数组作为函数传递
1>数组元素作为函数参数传递也就是跟变量一样是值传递。
2>数组作为函数传递
将数组作为函数参数进行传递, 传递的内容是数组的首地址
因此长度信息会丢失, 所以函数需要第二个参数表示数组的长度
因此函数模型为:
void func(int arr[], int length) {
...
}
由于传递的是地址, 在函数中声明的变量参数, 存储了数组的地址
使用下标访问的元素, 与 mian 函数中数组定义的元素就是同一个元素
因此得到一个结论
在函数中直接修改数组元素, 函数外的数组元素跟着修改
二 、二维数组
1. 二维数组概念:
可以看做是一个特殊的一位数组。这个一维数组的每一个元素又是
一个一维数组
二维数组的定义
数据类型
数组名 数组名[第一维数组的长度(行)][第二维数组的(列)]
int a[2][3];
理解方法:
1> 这是一个特殊的一位数组,一位数组有两个元素a[0],a[1]
a[0] 右存放了一个一维数组该数组的长度为3
2>定义了一个2行3列的一个的数组
2 注意事项:
1> 数组名严格遵守标示符命名规范
2>int b ;int a[2][3] 数组名不能和变量名同名
3> 数组的长度可以是常量也可以是常量表达式 int a[2+1][3-2];
4> 数组长度可以是宏定义
#define M 2
#define N 3
int [M][N]; 相当于定义了a[2][4];
5>xcode 编译器支持,c99标准不允许的写法
int x=2,y =3;
int a[2][3];
3 数组的初始化
1> 定义的同时初始化
完全初始化 int a1[2]={1,2};
特殊的一维数组,一维有两个数组 int a[2][3]={{12,34,56},{2,4,5}}; //分段
连续赋值int a[2][3]={1,2,3,4,5,6};
可以省略第一维
int a[][3]={[1,2,3],[4,5,6][2,3,4]}
int a[][2]={1,2,3,4,5,6,}
2> 部分初始化
int a[2][3]={1};
1 0 0
0 0 0
int a[3][4]={{1}{2}{3}}
1 0 0 0
2 0 0 0
3 0 0 0
3>先定义后初始化int a[3][4];
a[0][0]=1;
4 二维数组的遍历
int a[2][3];
printf("%d",a[1][2]);所有二维数组都是两个下标
//int a[row][col] row 可以理解为行,col 可以理解为列
#include
int main (int argc,const char * argv[]){
int row =2,loc =3;
int a[row][loc];
for(int i =0;i |
5 二维数组的地址
二维数组的首地址 :就是数组名 = &a[0]
第一行的地址 也是数组的首地址 = 第一行以第一个元素的地址 &a[0][0]
二维数组所占的字节总数?
1>总字节数 =每一行占用的字节数之和
2>总字节 = 元素的个数 * 元素的类型
3>总字节数 =sizeof(数组名)=行*列*siazof(int);
6 二维数组做函数参数
1》数组元素作为参数
score[3][4]
sum(score[1][2],score[2][2]);此处的score[1][2],score[2][2]都是一个变量,
所以变量作为函数的参数是单纯的值传递
2》二维数组名作为函数参数
sum(score)实参score和sum共用了一块存储空间,
用数组名作为函数的参数是地址传递
注意事项:
类型和长度要一致
二维数组作为函数的参数,可以不写第一维的长度
5 二维数组的地址
二维数组的首地址 :就是数组名 = &a[0]
第一行的地址 也是数组的首地址 = 第一行以第一个元素的地址 &a[0][0]
二维数组所占的字节总数?
1>总字节数 =每一行占用的字节数之和
2>总字节 = 元素的个数 * 元素的类型
3>总字节数 =sizeof(数组名)=行*列*siazof(int);
6 二维数组做函数参数
1》数组元素作为参数
score[3][4]
sum(score[1][2],score[2][2]);此处的score[1][2],score[2][2]都是一个变量,
所以变量作为函数的参数是单纯的值传递
2》二维数组名作为函数参数
sum(score)实参score和sum共用了一块存储空间,
用数组名作为函数的参数是地址传递
注意事项:
类型和长度要一致
二维数组作为函数的参数,可以不写第一维的长度
二维数组代码练习
#include
void printArray(int row ,int col,int array[row][col]); //遍历二维数组的
void initArray(int row,int low,int array[row][low]); //二维数组初始化
void getMaxAndmin(int row, int low,int arry[row][low]);//求二维数组的最大
int main(int argc, const char * argv[]) {
int n,m;
printf("请输入数组的行数\n");
scanf ("%d",&n);
printf("请输入数组的列数\n");
scanf ("%d",&m);
int a[n][m];
initArray(n,m, a);
printArray(n, m, a);
getMaxAndmin(n, m, a);
return 0;
}
void printArray(int row ,int col,int array[row][col]){
for(int i =0;i max) {
max=arry[i][j];
maxrow = i;
maxlow = j;
}
if (arry[i][j]