目录
一维数组:
一维数组的创建:
一维数组的访问:
一维数组在内存中的存储:
二维数组:
二维数组的创建:
二维数组的初始化:
二维数组的使用:
二维数组在内存中的存储:
数组作为函数参数:
但是,数组名是首元素地址的情况有两个例外:
冒泡排序的实例应用:
一维数组的创建:
数组是一组相同类型的元素的集合。
type_t arr_name[const_n];
type_t是指数组的元素类型
const_n是一个常量表达式(不能初始化变量n作为常量表达式,只有C99标准支持变长数组),用来指定数组的大小
int arr[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化
int arr[10]={1,2,3,4,5};//不完全初始化,后面的值为0;
int arr[]={1,2,3,4,5}; //等价于 int arr[5]={1,2,3,4,5};
char ch[]={'b','i','t'};//三个元素
char ch[]=“bit”;//四个元素,因为字符串末尾自带'\0'
int main() {
char ch1[] = "bit";
char ch2[] = { 'b','i','t' };
printf("%s\n", ch1);
printf("%s\n", ch2);
return 0;
}
这段代码的运行结果为:
原因是字符串“bit”中有结束字符‘\0’.而ch2中没有结束字符导致继续读取随机值(这种情况下求字符串长度也会出错)
一维数组的访问:
(1)数组是使用下标来访问的,下标是从0开始的
(2)数组的大小可以通过计算得到
int sz = sizeof(arr) / sizeof(arr([0]));
一维数组在内存中的存储:
//%p - 是按地址的格式打印 - 十六进制的打印
int main() {
int arr[10] = { 0 };
for (int i = 0; i < 10; i++) {
printf("arr[%d]=%p\n", i, &arr[i]);
}
return 0;
}
这段代码运行结果为:
所以:
(1)一位数组在内存中是连续存放的(所以可以用指针访问)
(2)随着数组下标的增长,地址是由低到高变化的
二维数组的创建:
int arr [3][4];
char arr[3][4];
二维数组的初始化:
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化
int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化
int arr[3][4] = { {1,2},{3,4},{5,6} };//每行填充两个元素
//因为初始化了三行,所以可以省略行数
//所以等价于int arr[][4] = { {1,2},{3,4},{5,6} };
二维数组的使用:
int main() {
//int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化
//int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化
int arr[3][4] = { {1,2},{3,4},{5,6} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
运行结果为:
二维数组在内存中的存储:
int main() {
int arr[3][4] = { {1,2},{3,4},{5,6} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("arr[%d][%d]=%p\n", i,j,&arr[i][j]);
}
}
return 0;
}
运行结果为:
所以:
(1)二维数组在内存中也是连续存放的(行内部连续,跨行也是连续的)
如图:
(2)二维数组也可以定义指针访问
数组作为函数参数:
数组作为函数参数传入,传入的是数组首元素的地址,等价于指针
int main() {
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
运行结果为:
(1)sizeof(数组名) 数组名表示整个数组-计算的是整个数组的大小,单位是字节
但在函数中接受传入的形参数组时,sizeof(形参数组)计算的是数组首地址元素的大小, 这一块具体可查看博主的相关博客C中关于能否在函数中求传入整型数组长度的问题
(2)&数组名 - 数组名表示整个数组 - 取出的是整个数组的地址(但与数组首元素地址一样,但意义不同),这一块具体可查看博主的相关博客C中数组名代表首元素地址的两个例外
#include
#include
#include
#include
#include
void bubble(int brr[], int len) {
for (int i = 0; i < len - 1; i++) { //一共进行几趟冒泡排序
bool flag = false; //用于判断本趟冒泡排序是否发生了元素的交换
for (int j = len - 1; j > i; j--) {//每趟冒泡排序要进行几次交换
if (brr[j] > brr[j - 1]) {
int tmp = brr[j - 1];
brr[j - 1] = brr[j];
brr[j] = tmp; //交换元素
flag = true; //本趟排序发生了元素的交换
}
if (flag == false) {
return;
}
}
}
}
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble(arr, sz);
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
运行结果为: