1.一维数组
1.1一维数组的创建
//C99 之后引用了变长数组的概念,数组的大小是可以使用变量指定的
1.2一维数组的初始化
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
1.3一维数组的使用
int main()
{
int arr[10] = { 0 };
int i = 0;
//数组元素的初始化
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
//按顺序输出数组元素
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
//倒序输出数组元素
for (i = 9; i >= 0; i--)
{
printf("%d ",arr[i]);
}
return 0;
}
1.4一维数组在内存中的存储
仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("&arr[%d]=%p\n", i, &arr[i]);
//%p输出地址
}
}
1.5 sizeof 和strlen的比较
sizeof是操作符 strlen是库函数,需要头文件<string,h>
计算对象是任意类型(int·····) 计算对象是字符串
计算的是占用内存的大小,单位是字节 计算的是\0之前出现的字符个数\,0不计算在内
sizeof在计算字符串时会把\0 也计算在内
#include<string.h>
int main()
{
char arr1[] = { "abc" };
char arr2[] = { 'a','b','c' };
printf("%d\n", strlen(arr1));
//这里数组内是字符串,后面自动有\0,所以数组元素个数是3个
printf("%d\n", strlen(arr2));
//注意这里求数组长度的时候因为数组初始化没有\0,所以strlen长度随机,所以strlen只针对字符串
return 0;
}
#include<string.h>
int main()
{
char arr[] = { "abcdefg" };
printf("%d\n", strlen(arr));
printf("%d\n", sizeof(arr));
return 0;
}
2.二维数组
2.1二维数组的创建和初始化
2.2二维数组的使用
int main()
{
int i = 0, j = 0;
int arr[3][5] = { {1,2,5,}, {2,4,6,7}, {1,6,7,9,8} };
//改变数组元素为1到15
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
arr[i][j] = i * 5 + j + 1;
}
}
//打印二维数组
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
2.3二维数组在内存中的存储
int main()
{
int arr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15} };
int i = 0, j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("arr[%d][%d]=%p\n", i, j, &arr[i][j]);
}
}
return 0;
}
3.数组做函数参数
3.1数组名是什么
int main()
{
int arr[5] = { 1,2,3,4,5 };
//数组名
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 main()
{
int arr[] = {10,9,8,7,6,5,4,3,2,1};
int sz = sizeof(arr)/sizeof(arr[0]);//计算数组元素个数
int i = 0, j = 0;
for (i = 0; i < sz - 1; i++)//sz-1表示的是最大趟数
{
for (j = 0; j < sz - 1 - i; j++)//sz-1-i表示第i+1趟要交换的最大次数
{
if (arr[j] > arr[j + 1])//用if语句判断是否交换
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
3.2冒泡排序的函数实现即数组传参
通过前面接收了数组名是什么就可以更好地理解数组的传参
当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。
错误做法
正确做法
void fun(int arr[],int sz)
{
printf("数组元素个数是%d\n", sz);
int i = 0, j = 0;
for (i = 0; i < sz - 1; i++)//sz-1表示的是最大趟数
{
for (j = 0; j < sz - 1 - i; j++)//sz-1-i表示第i+1趟要交换的最大次数
{
if (arr[j] > arr[j + 1])//用if语句判断是否交换
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
fun(arr,sz);//数组传参,数组名只传递数组首元素的地址
return 0;
}
练习:将数组A中的内容和数组B中的内容进行交换。(数组一样大)
void exchange(int* arr1, int* arr2, int len)
{
int i = 0;
int ex = 0;
for (i = 0; i < len; i++)
{
ex = arr1[i];
arr1[i] = arr2[i];
arr2[i] = ex;
}
for (i = 0; i < len; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
for (i = 0; i < len; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
}
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 6,7,8,9,10 };
int len = sizeof(arr1) / sizeof(arr1[0]);
exchange(arr1, arr2, len);
return 0;
}