目录
<一> 一维数组
(1) 一维数组的创建和初始化
创建:
type name [n]
在C99标准之前, [ ] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数
组的概念,数组的大小可以使用变量指定,但是数组不能初始化。
初始化:
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int arr[ ] = { 1,2,3 };
int arr[10] = { 0 };
当未指定数组大小时,数组必须初始化,初始化元素的个数就是数组的大小;当数组未初始化或未完全初始化时,未初始化的元素默认为0。
(2) 一维数组的使用
数组通过下标来访问,下标从0开始。
#include<stdio.h>
int main()
{
int arr[3] = {0};
//计算数组元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
//对数组内容赋值
int i = 0;
for (i = 0;i < sz; i++)
{
arr[i] = i + 1;
}
//打印数组
int j = 0;
for (j = 0;j < sz; j++)
{
printf("%d ", arr[j]);
}
}
(3) 一维数组在内存中的存储
随着数组下标增长,元素地址也在有规律增长(增长大小为元素类型所占内存大小),由此可见,数组在内存中是连续存放的。
<二> 二维数组
(1) 二维数组的创建和初始化
创建:
type name [row][col];
同一维数组,在C99标准之前,row,col都是常量。
初始化:
int arr[2][2] = {1,2,3,4};
int arr[3][2] = {{1,2},{3}};//不完全初始化,第一行为1,2,第二行为3,0,第三行为0,0
int arr [ ][3] = {{1},{3}};//二维数组有初始化,则行可省略,列不可省。
(2) 二维数组的使用
二维数组下标来访问的。
#include<stdio.h>
int main()
{
int arr[2][3] = { 0 };
int i = 0;
int j = 0;
int n = 0;
//给二维数组赋值
for (i = 0;i < 2; i++)
{
for (j = 0; j < 3; j++)
{
arr[i][j] = ++n;
}
}
//打印二维数组
for (i = 0;i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
(3) 二维数组在内存中的存储
二维数组在内存中也是连续存储的 。
<三> 数组越界
数组的下标从0开始,最后第n个元素的下标是n-1,所以在访问数组时下标不能小于0或大于n-1,如果不在这个范围,就会造成数组的越界访问。C语言不会做越界检查,有些编译器也不会报错 ,所以在使用时,要自己做好越界检查。
<四> 数组作为函数参数
数组名是首元素的地址。
两个例外:
1 在定义arr所在的代码块中用sizeof计算arr的大小,sizeof(arr)表示整个数组的大小。
但是,作为函数参数时,并非如此。
#include<stdio.h>
int sz(int* arr)
{
return sizeof(arr) / sizeof(arr[0]);
}
int main()
{
int arr[3] = { 0 };
int n = sz(arr);
printf("%d",n);
return 0;
}
因为数组名是首元素地址,在函数传参时只是将一个指针传给函数,所以sizeof(arr)实际上是计算了一个指针类型的大小,而不是数组大小。
在x86(32位系统)中指针类型大小为4,sz的值是1,代码运行结果为1;在x64(64位系统)中指针类型大小为8,sz的值为2,代码运行结果为2.
解决方法:
在创建arr数组所在的代码块中,求出sz的大小,并将sz直接传给函数。
(数组排序)
#include<stdio.h>
void print(int* arr, int sz)
{
int i = 0;
for (i = 0;i < sz;i++)
{
printf("%d ", arr[i]);
}
}
void string_in_order(int* arr, int sz)
{
int i = 0;
while (sz > 1)
{
for (i = 1;i < sz;i++)
{
if (arr[i - 1] > arr[i])
{
int tem = *(arr + i);
*(arr + i) = *(arr + i - 1);
*(arr + i - 1) = tem;
}
}
sz--;
}
}
int main()
{
int arr[] = { 2,3,5,8,7,9,4,1,6 };
int sz = sizeof(arr) / sizeof(arr[1]);
string_in_order(arr, sz);
print(arr, sz);
return 0;
}
2 &arr表示的是整个数组的地址。
&arr+1与&arr地址相差12,正好是整个arr数组所占内存的大小。