数组(一)
1、学习目标
- 掌握一维数组的使用
- 总结与思考
2、数组概述
- 数组是构造数据类型之一
- 数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。
- 数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是一维的,也可以是多维的。
3、一维数组的定义
-
所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。
-
C语言中,一维数组的说明一般形式如下:
<存储类型> <数据类型> <数组名> [<表达式>];
-
例子:
#include <stdio.h> int main() { int a[6], i; for(i = 0; i < 6; i++) printf("%p\n",&a[i]);//打印数据的地址,所以需要加& puts(""); printf("%p\n",a); printf("%d\n",sizeof(a)); return 0; }
运行结果:int型数组中每个元素占4个字节
/array$ ./app 0x7ffd73f1c370 0x7ffd73f1c374 0x7ffd73f1c378 0x7ffd73f1c37c 0x7ffd73f1c380 0x7ffd73f1c384 0x7ffd73f1c370 24
-
数组名表示内存首地址,是地址常量;sizeof(数组名)是数组占用的总内存空间。
编译时分配连续内存,内存字节数=数组维数*sizeof(元素数据类型)
-
注意事项(一维):
-
C语言对数组不作越界检查,使用时要注意数组长度
int a[5];a[5] = 10
-
关于用变量定义数组维数
int i = 15; int a[i]
-
-
例:i = 6, a[i]
#include <stdio.h> int main() { int i = 6, a[i]; for(i = 0; i < 6; i++) printf("%p\n",&a[i]); puts(""); printf("%p\n",a); printf("%d\n",sizeof(a)); return 0; }
运行结果:
/array$ ./app 0x7ffd8b8d0640 0x7ffd8b8d0644 0x7ffd8b8d0648 0x7ffd8b8d064c 0x7ffd8b8d0650 0x7ffd8b8d0654 0x7ffd8b8d0640 24
-
一维数组的引用
-
数组必须先定义,后使用
-
只能逐个引用数组元素,不能一次引用整个数组
-
数组元素表示形式:数组名[下标],下标可以是常量或整型表达式。
-
如:int a[10];
printf(“%d”,a);错误写法
-
int a[10];
for(j = 0; j < 10; j++)
printf(“%d\t”, a[j]);正确的写法
-
-
-
一维数组的初始化
-
初始化方式:在定义数组时,为数组元素赋初值
int a[5] = {1,2,3,4,5};
-
说明
- 数组不初始化,其元素值为随机数
- 对static数组元素不赋初值,系统会自动赋以0值
- 只给部分数组元素赋初值
-
示例
-
static int a[5]
等价于:a[0]=0; a[1]=0;a[2]=0;a[3]=0;a[4]=0
-
int a[5]={2,3,4}
等价于:a[0]=2;a[1]=3;a[2]=4;a[3]=0;a[4]=0
-
int a[3]={2,3,4,6,5} 错误
-
int a[]={1,2,3,4,5};编译系统根据初值个数确定数组维数
-
-
实例编程
-
只给部分元素赋值
#include <stdio.h> int main() { // int i = 6, a[i]; int a[6] = {1, 4, 7}, i; for(i = 0; i < 6; i++) printf("%p , %d\n", &a[i], a[i]); puts(""); printf("%p %d\n", a, a[0]); printf("%d\n",sizeof(a)); return 0; }
运行结果:
array$ ./app 0x7ffddd119260 , 1 0x7ffddd119264 , 4 0x7ffddd119268 , 7 0x7ffddd11926c , 0 0x7ffddd119270 , 0 0x7ffddd119274 , 0//剩余部分自动补0 0x7ffddd119260 1 24
-
根据初值个数确定数组包含的数据个数
#include <stdio.h> int main() { int b[] = {3,2,4,5,7,1}, i, n; n = sizeof(b) / sizeof(int);//数组的总空间/一个字符的空间=数组包含的个数 for(i = 0; i < 6; i++) printf("%p , %d\n", &b[i], b[i]); puts(""); printf("%p %d\n", b, b[0]); printf("%d\n",sizeof(b)); printf("%d\n", n); return 0; }
运行结果:
array$ ./app 0x7ffd26c2e8e0 , 3 0x7ffd26c2e8e4 , 2 0x7ffd26c2e8e8 , 4 0x7ffd26c2e8ec , 5 0x7ffd26c2e8f0 , 7 0x7ffd26c2e8f4 , 1 0x7ffd26c2e8e0 3 24 6
-
冒泡排序:重复的走访要排序的数列
#include <stdio.h> int main() { int a[] = {1, 4, 7, 11, 30, 8, 10, 20}; int i, j, n, t; n = sizeof(a) / sizeof(int); for(i = 0; i < n-1; i++){ //j+1<=n-1-i,j<=n-2-i,j<n-1-i for(j = 0; j < n-1-i; j++){ if(a[j] > a[j+1]){ t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } for(i = 0; i < n; i++) printf("%d ", a[i]); puts(""); // putchar('\n'); return 0; }
运行结果:
array$ ./app 1 4 7 8 10 11 20 30
-
-