C语言学习-数组
今天主要学习数组,什么叫是数组呢?
数组:就是存放相同类型的若干变量的集合。数组属于构造类型。
一维数组的定义方式:类型 数组名[元素个数] = {元素1, 元素2, .........};
int a[5];
注意:[]只能放在数组名的后面,下面的都是错误写法:
1 int a[5] a;// 错误 2 int[] b; // 错误
**[]里面的个数必须是一个固定值,可以是常量(比如7、10)、常量表达式(比如3+4、5*7)。绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要省略元素个数(当数组作为函数的形参和数组初始化时除外)
下面的写法是正确的:
1 int a[7]; // 整型常量 2 int b['A']; // 字符常量,其实就是65 3 int c[3*4]; // 整型常量表达式
下面的写法是错误的:
1 int a[]; // 没有指定元素个数,错误 2 3 int i = 9; 4 int a[i]; // 用变量做元素个数,错误
定义数组时,系统将按照数组类型和个数分配一段连续的存储空间来存储数组元素,如int a[3]占据了连续的12字节存储空间(在64位编译器环境下,一个int类型占用4个字节)。要注意的是,数组名代表着整个数组的地址,也就是数组的起始地址,即第一个元素的地址就是整个数组的地址。
初始化的一般形式是:类型 数组名[元素个数] = {元素1, 元素2, ...};
int a[5] = {1, 2, 3, 4, 5};
相当于:
int a[5]; a[0] = {1}; a[1] = {2}; a[2] = {3}; a[3] = {4}; a[4] = {5};
注意的是:1、C语言中数组下标都是从0开始的。
2、C语言中编译器是不会对数组下标越界进行检查的,所以自己访问数组元素时要小心
**元素值列表可以是数组所有元素的初值,也可以是前面部分元素的初值
int a[5] = {2, 5};
当数组为整型时,初始化未确定初值的元素,默认为0,所以上面的a[2]、a[3]、a[4]都为0
**当对全部数组元素都赋初值时,可以省略元素个数
int a[] = {3, 4, 5, 8, 9};
说明数组a的元素个数是5
*** 数组初始化时的赋值方式只能用于数组的定义,定义之后只能一个元素一个元素地赋值
下面的写法是错误的:
1 int a[3]; 2 3 a[3] ={1, 2, 3}; // 错误 4 5 a = {1, 2, 3}; // 错误
其实为什么是错误的写法呢?我们可以简要分析一下。
1> 第3行的a[3]代表着访问数组的第4个元素,首先这里已经是数组下标越界了;就算没有越界,给a[3]赋值时也应该赋一个int类型的整数,不应该是{}。
2> 第5行的a是数组名,代表着数组的地址,它是个常量!给常量赋值,那肯定错了!
***一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响实参
1 // b是test函数的形参(形式参数) 2 void test(int b) { 3 b = 20; 4 } 5 6 int main() 7 { 8 int a[3]; 9 a[0] = 10; 10 11 printf("函数调用前的a[0]:%d\n", a[0]); 12 13 test(a[0]); // a[0]是test函数的实参(实际参数) 14 15 printf("函数调用后的a[0]:%d", a[0]); 16 return 0; 17 }
输出结果:
***数组名代表着整个数组的地址,如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一存储空间的同一个数组。这样形参数组修改时,实参数组也同时被修改了。形参数组的元素个数可以省略。
1 // b是test函数的形参(形式参数) 2 void test(int b[]) { // 也可以写int b[5] 3 b[0] = 20; 4 } 5 6 int main() 7 { 8 int a[5]; 9 a[0] = 10; 10 11 printf("函数调用前的a[0]:%d\n", a[0]); 12 13 test(a); // a是test函数的实参(实际参数) 14 15 printf("函数调用后的a[0]:%d", a[0]); 16 return 0; 17 }
输出结果:
练习:
1.对数组进行求和操作,打印计算结果。
1 #define SIZE 10 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) { 5 int a[SIZE] = {0},i= 0, sum = 0; 6 for(i = 0; i < SIZE; i++){ 7 a[i] = i+10; // 每次循环都+10 8 sum += a[i]; // 每次+10的和 9 printf("a[%d] = %d\n", i, a[i]); // 输出每次产生的数 10 } 11 12 printf("数组的总和:%d\n", sum); 13 return 0; 14 }
2.随机产生20个10~50的正整数存放到数组中,并求数组中的多有元素最大值、最小值、平均值及各元素之和。
1 #define LEN 20 // 宏定义一个常量 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) { 5 6 int num[LEN] = {0}; // 初始化整型数组 7 int max = 0, min = 0, avg, sum, count = 0; 8 for (int i = 0; i < LEN ; i++) { 9 // 产生一个10~50的正整数 10 num[i] = arc4random() % 41 +10; 11 printf("%d ",num[i]); // 输出刚产生的随便数 12 sum += num[i]; // 求和 13 count++; // 统计产生了几个数 14 if (i == 0) { // 当数组下标等于1时,假设最大值和最小值都为数组中的第一个下标值 15 min = num[0]; 16 max = num[0]; 17 } 18 // 比较最取小值 19 if (min > num[i]) { 20 min = num[i]; 21 } 22 // 比较最小在值 23 if (max < num[i]) { 24 max = num[i]; 25 } 26 } 27 28 avg = sum / count; // 求平均值 29 printf("最大值=%d,最小值=%d,数组之和=%d,平均值=%d\n", max, min, sum, avg); 30 31 return 0; 32 }
3.编写一个程序,输入两个包含5个元素的数组,先将两个数组升序排序,然后将这两个数组合并成一个升序数组。
1 #import <Foundation/Foundation.h> 2 3 int main(int argc, const char * argv[]) { 4 5 int inputNum1 = 0, inputNum2 = 0; 6 int num1[5] = {0}, num2[5] = {0}, num3[10] = {0}; 7 printf("请输入5个数:\n"); 8 for (int i = 0; i < 5; i++) { 9 scanf("%d",&inputNum1); 10 num1[i] = inputNum1; 11 } 12 13 14 printf("在输入5个数:\n"); 15 for (int j = 0; j < 5; j++) { 16 scanf("%d",&inputNum2); 17 num2[j] = inputNum2; 18 } 19 20 // num1数组的排序(冒泡排序) 21 int length1 = sizeof(num1) / sizeof(int); 22 int length2 = sizeof(num2) / sizeof(int); 23 for (int i = 0; i < length1 - 1 ; i++) { 24 for (int j = 0; j< length1 - i -1; j++) { 25 if (num1[j] > num1[j + 1]) { 26 int temp = num1[j]; 27 num1[j] = num1[j + 1]; 28 num1[j + 1] = temp; 29 } 30 } 31 } 32 // num2数组的排序(冒泡排序) 33 for (int i = 0; i < length2 - 1 ; i++) { 34 for (int j = 0; j< length2 - i -1; j++) { 35 if (num2[j] > num2[j + 1]) { 36 int temp = num2[j]; 37 num2[j] = num2[j + 1]; 38 num2[j + 1] = temp; 39 } 40 } 41 } 42 43 //合并数组 44 for (int i = 0; i < 5; i++) { 45 num3[i] = num1[i]; 46 } 47 for (int j = 5; j < 10; j++) { 48 num3[j]= num2[j - 5]; 49 } 50 51 52 // 对新产生的数组进行排序 53 int lenght3 = sizeof(num3)/sizeof(int); 54 for (int i = 0; i < lenght3 - 1; i++) { 55 for (int j = 0; j <lenght3 - i - 1; j++) { 56 if (num3[j] > num3[j + 1]) { 57 int temp = num3[j]; 58 num3[j] = num3[j + 1]; 59 num3[j + 1] = temp; 60 } 61 } 62 } 63 64 // 遍历输出排序好的num3数组 65 for (int i = 0; i < lenght3; i++) { 66 printf("num3[%d] = %d,", i, num3[i]); 67 } 68 69 return 0; 70 }