一维数组的创建和初始化
//创建
int ar[15]; //int-数组内数字类型 arr-数组名 15(只能是常量)-数字个数
//初始化
int ar[15] = { 1, 2, 3 }; //不完全初始化,剩下的是0
//初始化结果相同,方式不同
char ar2[3] = {'a', 'b'};
char ar3 = "ab";
//不指定大小
char ar4[]="abc";
sizeof与strlen的辨析
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", strlen(arr));
//strlen 求字符串长度-只针对字符串长度-库函数
//sizeof 可以求数组、变量、类型所占字节-操作符
输出:
7
6
一维数组的使用
一维数组在内存中的存储
由下面代码和运行结果分析可得:一维数组在内存中是连续存放的
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
二维数组的创建和赋值
二维数组的创建
注意:二维数组的创建只能省略行
赋值不充分,剩余都是0
int arr[3][4];
int arr[3][4] = { 1, 2, 4, 5, 6, 7, 9 } //首先对第一行赋值,赋值完进入第二行
int arr[3][4] = { {1,2},{3,4} }; //将每一行看成一维数组进行赋值
int arr3[][4] = { {1,2,3,4},{1,3,4,5} };
二维数组的使用
int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
int i = 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;
}
二维数组在内存中的存储
由下面代码和运行结果分析可得:二维数组在内存中依然是连续存放的
既然二维数组依然是连续存放的那么其和一维数组的区别在什么地方呢?
其实我们可把arr[i][j]中的ar[i]看作ar[i][j]的数组名,相当于产生了多个一维数组,
这也同时印证了二维数组可以以一维数组为单位进行储存。
int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d]%p\n",i,j, &arr[i][j]);
}
printf("\n");
}
return 0;
}
数组作为函数参数
数组名代表首元素的地址。
例外
sizeof(数组名) ,数组名是整个数组,计算的是整个数组的字节数
&数组明,数组名代表整个数组,取的时整个数组的地址
注意
数组传参传的是首元素地址
冒泡排序实现
数组个数的计算要放在主函数,并通过参数传递给bubble_sort函数。因为数组传参只传了首元素地址,假如在32位环境下,该地址占4个字节,与整形相同,故若在bubble_sort函数中计算数组个数恒等于1。这样的话连循环都进不去,更别说实现排序了。
该算法其实还可以进行优化,即若已经有序,该算法还是会进行判断。于是我们引入flag=1,先默认已经有序,若不是有序,则会进入第二层循环并进行元素交换,同时将flag设置为0。在第一层循环末尾加上一个分支语句,若flag==1,则跳出第一层循环,不在进行排序判断,显然优化后的算法可以完成只要排序完成,就会跳出循环,大大提升了效率。
void bubble_sort(int arr[], int sz)
{
int i = 0;
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;
}
}
}
}
int main()
{
int arr[] = { 10,9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
bubble_sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//引入flag对该算法进行优化
void bubble_sort(int arr[], int sz) //数组传参传的是首元素的地址
{
int i = 0;
for (i = 0; i < sz - 1; i++) //控制进行几次冒泡排序
{
int j = 0;
int flag = 1;
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)
{
break;
}
}
}
}
int main()
{
int arr[] = { 10,9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
bubble_sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}