一:一维数组
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
数组 - 一组数 - 一组相同类型元素的集合
一:一维数组
1.一维数组的创建和初始化
数组的创建:
type_t arr_name [const_n]
type_t 是指数组的元素类型
const_t 是一个常量表达式,用来指定数组的大小
int main()
{
int a = 10; //初始化
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; //完全初始化
int arr2[10] = { 1,2,3,4,5 }; //不完全初始化
int arr3[]= {1,2,3,4,5} == int arr[5] = {1,2,3,4,5}
char ch1[5] = { 'b','i','t' };
char ch2[] = { 'b','i','t' }; // [ ] 里是3
char ch3[5] = "bit"; // b i t \0
char ch4[] = "bit";
char ch5[] = "bit";
char ch6[3] = { 'b','i','t' };
printf("%d\n", strlen(ch5)); //3
printf("%d\n", strlen(ch6)); //随机值
printf("%s\n", ch5); //输出结果bit
printf("%s\n", ch6); //输出结果bit + 乱码
return 0;
}
2.一维数组的使用:
int main()
{
int arr[10] = { 0 };
arr[4] = 5; // [ ] - 下标引用操作符
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr[0]));
printf("-----------------\n");
for (i = 0;i < sz; i++)
{
printf("%d ", arr[i]); //引用操作符中在定义的时候不能用变量,其他情况可以
}
return 0;
}
3.一维数组在内存中的存储
①一维数组在内存中是连续存放的!
②随着数组下标的增长,地址是由低到高变化的
int main()
{
//printf("%x\n", 0x12); //结果12
//printf("%p\n", 0x12); //结果00000012
int arr[10] = { 0 };
int i = 0;
for (i = 0;i < 10;i++)
{
printf("&arr[%d] = %p\n",i,&arr[i]);
}
return 0;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
二:二维数组
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
创建
int arr[3][4];
char ch[3][10];
初始化 - 创建的同时给赋值
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};//不完全初始化 - 后面补0
int arr[3][4] = { {1,2},{3,4},{4,5} };
二维数组的使用
int arr[][4] = { {1,2},{3,4},{4,5} };
int i = 0;
int j = 0;
for (i = 0; i < 3;i++)
{
for (j = 0;j < 4;j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
二维数组在数组中的存储
二维数组在内存中也是连续存放的
一行内部连续,跨行也是连续的
int arr[][4] = { {1,2},{3,4},{4,5} };
int i = 0;
int j = 0;
int* p = &arr[0][0];
for (i = 0;i < 12;i++)
{
printf("%d ", *p);
p++;
}
for (i = 0; i < 3;i++)
{
for (j = 0;j < 4;j++)
{
printf("&arr[%d]{%d} = %p\n",i,j, &arr[i][j]);
}
}
return 0;
}
三:数组作为函数参数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
数组作为函数参数
冒泡排序的思想: 两两相邻的元素进行比较,并且可能的话需要交换
9 8 7 6 5 4 3 2 1 0 //8 7 6 5 4 3 2 1 0 9
8 9 7 6 5 4 3 2 1 0 //7 8 6 5 4 3 2 1 0 9
8 7 9 6 5 4 3 2 1 0 //7 6 8 5 4 3 2 1 0 9
... //...
8 7 6 5 4 3 2 1 0 9 //7 6 5 4 3 2 1 0 8 9
10 个数字 9 次排序, n 个数字 n - 1 次排序
void bubble_sort(int arr[],int sz)
{
//计算数组元素个数
//确定次数
int i = 0;
int flag = 1;
for (i = 0;i < sz - 1;i++)
{
//一次冒泡排序的过程
int j = 0;
for (j = 0;j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//排序为升序
int sz = sizeof(arr) / sizeof(arr[0]); //当一个数组传参的时候,形参内部是无法计算数组个数的。
bubble_sort(arr,sz); //bubble泡泡 sort排序 bubble_sort冒泡排序
//数组传参的时候,传递的是数组首元素的地址
return 0;
}
数组名是什么
数组名是首元素地址
但是有两个例外:
1.sizeof(数组名) - 数组名表示整个数组 - 计算的是整个数组的大小 - 单位是字节
2.&数组名 - 数组名表示整个数组 - 去除的是整个数组的地址
int main()
{
int arr[10] = { 0 };
printf("%p\n", &arr); //1 - &arr取出的是数组的地址
printf("%p\n", &arr + 1); //0x28 -> 40
printf("%p\n", arr); //2
printf("%p\n", arr + 1); //0x28 -> 4
printf("%p\n", &arr[0]); //3 三个输出结果相同
int sz = sizeof(arr);
printf("%d\n", sz); //结果为40
printf("%p\n", &arr[0]);
printf("%p\n", arr);
return 0;
}