目录
一.一维数组
1.数组的创建和初始化
数组的定义:
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
(数组是一组相同类型元素的集合)
int arr[3];
char arr[3];
double arr[2];
创建数组时 【】 应使用常量,不能使用变量
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)
(数组只能被整体初始化,不能直接赋值)
char arr1[] = "abc";//带/0
char arr2[3] = {'a','b','c'};//不带/0
2.一维数组的使用
数组是使用下标来访问的,下标是从0开始。
数组的大小可以通过计算得到。
//计算数组的元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
3.一维数组的储存
看以下代码,我们试着输出数组元素在内存中的地址
#include <stdio.h>
int main()
{
char arr[10] = {0};
int i = 0;
for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
在c语言中,任何变量(基本变量,指针变量,结构体变量,数组)空间都是整体开辟,但任何元素的起始地址一定是开辟的众多字节地址中地址最小的
二.二维数组
1.二维数组的创建和初始化
int arr[3][4];
char arr[3][5];
double arr[2][4];
创建二维数组时第一个【】可以省略但第二个【】不能省略
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {
{1,2},{4,5}};
int arr[][4] = {
{2,3},{4,5}};
2.二维数组的使用
二维数组的本质是一维数组,只不过内部元素放的是数组
int arr[3][4] = { 0 };//表示该一维数组中存放了三组存放了四个0的数组
3.二维数组在内存中的存储
像一维数组一样,这里我们尝试打印二维数组的每个元素。
#include <stdio.h>
int main()
{
char arr[3][4];
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]);
}
}
system("pause");
return 0;
}
我们看到,二维数组在内存中的存放也是连续的,这样证明二维数组的本质是一维数组
三.数组名
数组名是数组首元素的地址。(有两个例外)
1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
数组传参时发生降维,降维成指针
void bubble_sort(int arr[])//int arr[] 表示的是一个指针: int *arr 。
数组降维:原因:减少函数传参的成本问题(空间+时间)
结果:降维成指向其内部元素类型的指针
用sizeof求数组元素中个数时,尽量在数组定义中去求
在对指针+1时,是加上其所指向类型的大小