目录
数组:一组相同类型数据的集合。
数组的定义其实就是开辟一串连续的,相同大小的空间。
一维数组
定义:int arry[10];
初始化:int arry[10]={1,2,3,4,5};
int arry[]={1,2,3,4,5};
int arry[10]={1};//初始化第0个元素为1,剩下的以0填充
int arry[10]={0};
访问:数组中的元素是根据下标访问的,从0开始。
int arry[10]={1};
arry[10]是越界访问,arry数组中的元素为arry[0]~arry[9]。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arry[10];
for (int i = 0; i < 10; i++)
{
printf("%p\n", &arry[i]);
//&arry[i])获取数组第i个元素所在空间的地址并使用%p进行打印
}
system("pause");
return 0;
}
由此可见,arry数组中每个元素占int 大小(4个字节)的空间。
存储:定义了一个数组其实就是开辟了一传连续的内存空间。即数组中的数据在内存中是连续存储的。
二维数组
定义:arry[3][5];
arry数组有三个元素,每个元素也是一个数组,这个数组中也有5个元素。所以arry数组一共有15个元素。
初始化:int arry[2][3]={{1,2,3},{4,5,6}};
int arry[2][3]={0};//数组中第0个元素为0,其余元素以0填充。
int arry[][3]={{1,2,3},{4,5,6}};
int arry[][3]={1,2,3,4,5,6};
注意:二维数组存储时,“行”可以为空,但是“列”不能为空。
存储:二维数组在内存中的存储也是连续的。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arry[][3] = { 1, 2, 3, 4, 5, 6 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
printf("%p\n", &arry[i][j]);
}
system("pause");
return 0;
}
数组名
数组名在使用的时候,可以代表数组首元素的地址,但是不能代表数组的地址。
但是有两个比较特殊的地方使用的时候不一样。
int arry[10];
1.sizeof(arry) 得到的是数组所占空间大小,而并非指针大小。
2.&arry是对arry数组取地址,而不是对数组首元素取地址。
在以上两种情况下,数组名表示的是数组,在其他情况下,数组名表示数组首元素的地址。
数组作为函数的参数传递
int arry[10];
func(arry); //此时,传递的不是数组,而是数组首元素的地址。
void func(int *arry){ //数组作为参数传递时,传递的都是地址。
}
形参时一个指针变量, sizeof(arry)求的是指针的大小为4。
数组作为函数的参数在传递时,在函数内是无法获取数组的元素个数的。因此,数组作为参数传递的同时,需要再定义一个参数,用来传递数组元素个数。
#include<stdio.h>
#include<stdlib.h>
void print_arry(int *arry,int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d\n", arry[i]);
}
}
int main()
{
int arry[5] = { 1, 2, 3, 4, 5 };
int sz =sizeof(arry) / sizeof(arry[0]);
print_arry(arry,sz);
system("pause");
return 0;
}