#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//数组:一组相同类型元素的集合
//创建方式:type_t arr_name [const_n]
//例: int arr[10] char ch[5]
// char ch[10] = { 'a','b','c' };
// //a b c 0 0 0 0 0 0 0
// char ch1[10] = "abc";
// //a b c \0 0 0 0 0 0 0
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
// //[] - 下标引用操作符
// //printf("%d\n",arr[4]);//结果为5
// int i = 0;
//
// //打印每个元素的地址
// for (i = 0; i < 10; i++)
// {
// printf("&arr[%d] = %p\n", i,&arr[i]);
// }
//
// /*想全部打印每个元素要用循环
// for (i = 0; i < 10; i++) //元素过多 个数用int sz=sizeof(arr)/sizeof(arr[1])计算
// {
// printf("%d\n", arr[i]);
// }*/
// return 0;
//}
/ 二维数组
//数组创建: int arr[3][4]; char arr[3][5]; double arr[3][4];
//可以看做三行四列
//数据
//1 2 3 4
//2 3 4 5
//3 4 5 6
//数组初始化
//int main()
//{
// //存放数据可以
// int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };//如果不够 会依次放入 后面补0
// //也可以像:int arr1[3][4] = {{1,2},{3,4},{5,6}}; 此结果后两列为0
// return 0; //初始化行可以省略 列不能
//}
//数组的使用
//int main()
//{
// int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
// int i = 0;
// //打印某个元素
// printf("%d\n", arr[2][0]); //二维数组行列 下标也是从0开始
//
// //打印全部数组
// /*for (i = 0; i < 3; i++)
// {
// int j = 0;
// for (j = 0;j < 4;j++)
// {
// printf("%d ", arr[i][j]);
// }
// printf("\n");
// }*/
// return 0;
//}
//数组作为函数参数传参
//形参有两种写法
//1.数组
//2.指针
//冒泡排序
//核心思想:两个相邻元素进行比较
// 《一趟冒泡排序会让一个数据来到它最终应该出现的位置上》
//
//1.数组形式传参
//void bubble_sort(int arr[],int sz) //数组名本质是数组首元素地址
//{ //在函数内部计算int sz = sizeof(arr) / sizeof(arr[0]);
// //地址应该指针接收所以(int arr[]) 中的arr本质是指针变量
// //所以这里的sz值为1,不对 //可以在主函数算出sz 再传到函数
// //确定趟数 本例子需要元素个数-1趟
// int i = 0;
// for (i = 0; i < sz - 1; i++)
// {
// //一趟冒泡排序
// int j = 0;
// for (j = 0; j <sz-1-i; j++) //第一趟有10个元素排序比较 进行9次比较 第二趟8次
// { //所以元素个数减一,再减去进行的躺数
// if (arr[j] > arr[j + 1])
// //交换
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//
//}
//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);
// //打印结果验证
// int i = 0;
// for (i = 0; i < sz; i++)
// printf("%d ", arr[i]);
// return 0;
//}
//数组名确实能表示首元素地址
// 但是有两个例外:
// 1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
// 2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
//
//int main()
//{
// int arr[10] = { 0 };
// printf("%p\n", arr);//首元素地址
// printf("%p\n", arr+1);//第二个元素地址
//
// printf("%p\n", &arr[0]);//首元素地址
// printf("%p\n", &arr[0]+1);//第二个元素地址
//
// printf("%p\n", &arr);//数组的地址
// printf("%p\n", &arr+1);//数组的地址+数组大小后的地址
//
//
// //int n = sizeof(arr);//40
// //printf("%d\n", n);
//
// return 0;
//}
//二位数组的数组名也表示首元素地址
int main()
{
int arr[3][4];
printf("%d\n", sizeof(arr) / sizeof(arr[0]));//计算出是行数 数组大小/一行大小
printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));//列数大小 一行大小/首字母大小
printf("%p\n", arr);//这里打印的是 首字母/首行 的地址
printf("%p\n", arr + 1);//这里打印的是第二行首字母
return 0;
}