目录
一维数组的创建
一维数组的初始化
一维数组的使用
一维数组在内存中的存储
二维数组的创建
二维数组的初始化
二维数组的使用
二维数组在内存中的存储
数组越界
数组作为函数参数
一维数组的创建
数组的定义:数组是一组相同类型元素的集合
创建方式:元素类型 数组名 [数组的大小(常量表达式)]
如果int arr[变量]要能够使用,必须要C99语法支持变长数组才可以。
一维数组的初始化
初始化:在创建数组的同时给数组的内容一些初始值
如果数组的内存空间全部填满了,就叫完全初始化。比如 int arr[4]={1,2,3,4};
如果没全部填满,则自动补0(字符数组则补 ),就叫不完全初始化。比如 int arr[4]={1,2}
还有一种特殊的数组:int arr[]={1,2,3,4},此时[]根据初始化的内容自动确定元素个数
-字符数组的初始化:
- char ch1[5]={‘s’,’b’};//s b
- char ch2[]={‘s’,’b’};//s b
- char ch3[5]=”sb”;//s b
- char ch4[]=”sb”;//s b
- char ch5[]=”sb”;//s b
- char ch6[]={‘s’,’b’};//s b
一维数组的使用
[]是下标引用操作符,它是数组访问的操作符。
数组是使用下标来访问的,下标是从0开始的
数组的元素个数可以通过sizeof()计算得出,只需要求出数组所占内存/数组中一个元素所占内存,得到结果即为元素个数
一维数组在内存中的存储
#include
int main()
{
int arr[10] = {0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);//求数组元素个数
for(i=0; i
程序运行结果
我们不难发现,每个地址都相差4,是因为每个整型元素内存大小都是4个字节
结论:1.一维数组在内存中是连续存放的 2.随着数组下标增长,地址是由低到高变化的
于是我们所用的指针可以这样操作:
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
int* p = arr;//数组名是数组首元素的地址
int i = 0;
for(i=0;i<10;i++)
{
printf("%d ",*p);/
bubble_sort(arr, sz);
int i;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
验证数组名是首元素的地址:
#include
int main()
{
int arr[] = { 0 };
printf("%pn",&arr[0]);
printf("%p", arr);
return 0;
}
程序运行结果说明数组名确实是首元素地址
但是,有两个例外:
1.sizeof(数组名) – 数组名表示整个数组 – 计算的是整个数组的大小,单位是字节
2.&数组名 – 数组名表示整个数组 – 取出的是整个数组的地址
然后我们验证一下&:
#include
int main()
{
int arr[] = { 0 };
printf("%pn",&arr[0]);
printf("%pn", arr);
printf("%pn", &arr);
return 0;
}
程序运行结果
问题来了,怎么三个都是一模一样?我们刚刚说的,&数组名-取出的是整个数组的地址,这其实并没有错,因为数组的地址是从第一个元素的地址开始的,而&arr[0]和arr都是取出元素的首个地址,要注意区分这个细微的差别,我们这样验证:
#include
int main()
{
int arr[10] = { 0 };
printf("%pn", arr);
printf("%pn", arr + 1);
printf("%pn", &arr);
printf("%pn", &arr+1);
return 0;
}
这里我们就可以明显的看出来了,&arr+1,是整个数组的地址+1了,而arr只是从第一个元素的地址跳到了第二个元素的地址
注意:
数组作为函数传参时,形参可以写成两种形式(本质上是指针,但可以写成数组):
1.数组形式
2.指针形式
程序运行结果
我们不难发现,每个地址都相差4,是因为每个整型元素内存大小都是4个字节
结论:1.一维数组在内存中是连续存放的 2.随着数组下标增长,地址是由低到高变化的
于是我们所用的指针可以这样操作:
#includeint main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10}; int* p = arr;//数组名是数组首元素的地址 int i = 0; for(i=0;i<10;i++) { printf("%d ",*p);/ bubble_sort(arr, sz); int i; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
验证数组名是首元素的地址:
#includeint main() { int arr[] = { 0 }; printf("%pn",&arr[0]); printf("%p", arr); return 0; }
程序运行结果说明数组名确实是首元素地址
但是,有两个例外:
1.sizeof(数组名) – 数组名表示整个数组 – 计算的是整个数组的大小,单位是字节
2.&数组名 – 数组名表示整个数组 – 取出的是整个数组的地址
然后我们验证一下&:
#includeint main() { int arr[] = { 0 }; printf("%pn",&arr[0]); printf("%pn", arr); printf("%pn", &arr); return 0; }
程序运行结果
问题来了,怎么三个都是一模一样?我们刚刚说的,&数组名-取出的是整个数组的地址,这其实并没有错,因为数组的地址是从第一个元素的地址开始的,而&arr[0]和arr都是取出元素的首个地址,要注意区分这个细微的差别,我们这样验证:
#includeint main() { int arr[10] = { 0 }; printf("%pn", arr); printf("%pn", arr + 1); printf("%pn", &arr); printf("%pn", &arr+1); return 0; }
这里我们就可以明显的看出来了,&arr+1,是整个数组的地址+1了,而arr只是从第一个元素的地址跳到了第二个元素的地址
注意:
数组作为函数传参时,形参可以写成两种形式(本质上是指针,但可以写成数组):
1.数组形式
2.指针形式



