1,数组:一组相同类型元素的集合
#include<stdio.h>
//数组:一组相同类型元素的集合
int main() {
//下面的代码只能在支持C99标准的编译器上编译
int n = 10;
scanf("%d", &n);
int arr2[n];//这种数组是不能初始化的
return 0;
}
2,一维数组的初始化
#include<stdio.h>
//一维数组的初始化
int main() {
//初始化(分为完全初始化和不完全初始化)
int arr[10] = { 1,2,3 };//不完全初始化,剩余元素默认初始化为0
int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };//完全初始化
int arr2[] = [1, 2, 3];
char ch1[10] = { 'a','b','c' };//a b c 0 0 0 0 0 0 0
char ch2[10] = "abc"; //a b c \0 0 0 0 0 0 0
char ch3[] = { 'a','b','c' }; //a b c
char ch4[] = "abc"; //a b c \0
return 0;
}
3,一维数组的使用
#include<stdio.h>
//一维数组的使用
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//下标 0 1 9
//[] -> 下标引用操作符
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//10
//正打印
//for ( i = 0; i < sz; i++)
//{
// printf("%d ", arr[i]);
//}
//倒打印
for (i = sz-1; i >=0; i--)
{
printf("%d ", arr[i]);
}
return 0;
}
4,一维数组在内存中的使用(数组在内存中是连续存放的)
#include<stdio.h>
//一维数组在内存中的使用(数组在内存中是连续存放的)
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//下标 0 1 9
//[] -> 下标引用操作符
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//10
//打印数组每个元素的地址
for ( i = 0; i < sz; i++)
{
printf("&arr[%d] = %p\n", i, &arr[i]); //打印出来的每个地址差4
}
return 0;
}
5,二维数组的初始化(可以省略行数,但不能省略列数)
#include<stdio.h>
//二维数组的初始化(可以省略行数,但不能省略列数)
int main() {
int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
//第一行:1 2 3 4 第二行:2 3 4 5 第三行:3 4 5 6
int arr2[3][4] = { 1,2,3,4,2,3,4,5,3,4};
//第一行:1 2 3 4 第二行:2 3 4 5 第三行:3 4 0 0 (注意:补0了)
int arr3[3][4] = { {1,2},{3,4},{5,6} };
//第一行:1 2 0 0 第二行:3 4 0 0 第三行:5 6 0 0 (注意:补0了)
return 0;
}
6,二维数组的打印
#include<stdio.h>
//二维数组的打印
int main() {
int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
int i = 0;
//也可以重新初始化
//for (i = 0; i < 3; i++)
//{
// int j = 0;
// for (j = 0; j < 4; j++)
// {
// scanf("%d",&arr[i][j]);
// }
// printf("\n");
//}
for ( i = 0; i < 3; i++)
{
int j = 0;
for ( j = 0; j < 4; j++)
{
printf("arr1[%d][%d] = %d ",i,j,arr1[i][j]);
}
printf("\n");
}
return 0;
}
7,二维数组在内存中的存储
#include<stdio.h>
//二维数组在内存中的存储
int main() {
int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("&arr1[%d][%d] = %p\n", i, j, &arr1[i][j]);
}
}
return 0;
}
8,数组传参的时候,形参有2种写法
#include<stdio.h>
//数组传参的时候,形参有2种写法
//1,数组 int arr[]
//2,指针 int *arr
void bubble_sort(int arr[],int sz) {//冒泡排序(核心思想:两个相邻的元素进行比较)
//int sz = sizeof(arr) / sizeof(arr[0]);//注意;这句话出现在这里是错误的
//趟数
int i = 0;
for ( i = 0; i < sz-1; i++)
{
//一趟冒泡排序
int j = 0;
for ( j = 0; j < sz-1-i; j++)
{
//交换
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;
}
9,数组名
#include<stdio.h>
//数组名
//数组名确实能表示首元素的地址
//但是有2个例外
//1,sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
//2,&数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址
int main() {
int arr[10] = { 0 };
//下面的三句话输出内容完全相同
//printf("%p\n", arr);
//printf("%p\n", &arr[0]);
//printf("%p\n", &arr);
printf("%p\n", arr);//arr就是首元素的地址
printf("%p\n", arr+1);
printf("-------------------------------\n");
printf("%p\n", &arr[0]);//首元素的地址
printf("%p\n", &arr[0]+1);
printf("-------------------------------\n");
printf("%p\n", &arr);//数组的地址
printf("%p\n", &arr+1);//和上面的两句话不同,差了整个数组
//int n = sizeof(arr);//40
//printf("%d\n", n);
return 0;
}
10,二维数组的命名
#include<stdio.h>
//二维数组的命名
int main() {
int arr[3][4] = { 0 };
//求二维数组行数
printf("%d\n", sizeof(arr) / sizeof(arr[0])); //arr[0] 表示数组一整行元素的大小
//求二维数组列数
printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));
int sz = sizeof(arr);
printf("%d\n", sz);
printf("%p\n", arr);//二维数组的数组名也表示数组首元素的地址
printf("%p\n", arr + 1);
}