1.一维数组的定义,初始化和使用
定义一维数组
数组类型 数组名[数组长度]
int arr[3];
char arr1[2];
一维数组的初始化
代码块
int arr1[3] = { 1, 2, 3 };//arr1与arr2数组长度相同
int arr2[] = { 1, 2, 3 };
//如果在定义时未给出数组长度,则以初始值中的元素个数决定
char arr3[] = {'a','b','c'};//数组长度为3,元素分别为'a','b','c'
char arr4[] = { "abc" };//数组长度为4,元素分别为'a','b','c','\0'
一位数组的使用
通过下标操作符 [ ] 给数组元素赋值
代码块
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sz = sizeof(arr) / sizeof(arr[0]);//用sizeof求数组长度
//数组名单独在sizeof()的括号中时表示整个数组,sizeof以字节单位
int i = 0;
for (i = 0; i < sz; i++)
{
printf("arr[%d]:%p\n",i,&arr[i]);
}
return 0;
}
结果:
注意:下标从0开始
2.一维数组在内存中的存储
按下标升序打印数组中所有元素的地址
代码块:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sz = sizeof(arr) / sizeof(arr[0]);//用sizeof求数组长度
//数组名单独在sizeof()的括号中时表示整个数组,sizeof以字节单位
int i = 0;
for (i = 0; i < sz; i++)
{
printf("&arr[%d]:%p\n",i,&arr[i]);
}
return 0;
}
结果:
由结果可知同一数组下标从小到大的元素其地址由低到高有规律的递增,可得一维数组在内存中是连续存放的。
3.用指针访问一维数组
用指针访问一维数组并给数组元素赋值
代码块
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[10] = { 0};
//p是一个指针变量,它存放的是整型的地址
int *p = &arr;//将数组arr首元素的地址赋值给p
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;//通过解引用操作符*可以找到指针所指向的变量
printf("&arr[%d]:%d\n",i,arr[i]);
}
return 0;
}
结果:
4.二维数组的定义,初始化和使用
定义二维数组
数组类型 数组名【行】【列】
int arr1[2][3];
double [3][4];
二维数组的初始化
代码块
//没赋初始值的元素赋值为该数组类型的默认默认值。例:int 默认值为0
int arr1[2][3] = {0};//定义一个2行3列的二维数组
int arr2[][3] = {1,2,3,4,5,6,};//可以不给定行值,会自动根据初始值和列值计算出行值
int arr3[2][3] = {1,2,3,4,5,6};//arr2和arr3行列相同,对应元素值也相同
int arr4[2][3] = {{1,2,3},{4,5,6}};//各元素与arr3中对应下标元素相同
二维数组的使用
通过下标使用
代码块
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[3][2] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)//行下标
{
int j = 0;
for (j = 0; j < 2; j++)//列下标
{
arr[i][j] = i + j;
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
结果:
5.二维数组在内存中的存储
按下标升序打印数组中所有元素的地址
代码块
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[3][2] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)//行下标
{
int j = 0;
for (j = 0; j < 2; j++)//列下标
{
arr[i][j] = i + j;
printf("&arr[%d][%d]:%p\n",i,j,&arr[i][j]);
}
}
return 0;
}
结果:
由结果可知二维数组在内存中是连续存放的,并且同一数组下标从小到大的元素其地址由低到高有规律的递增。
6.用指针访问二维数组
用指针访问二维数组并给数组元素赋值
代码块
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[3][2] = { 0 };
int *p = arr;
int i = 0;
for (i = 0; i < 3 * 2; i++)
{
*(p + i) = i;
}
for (i = 0; i < 3; i++)//行下标
{
int j = 0;
for (j = 0; j < 2; j++)//列下标
{
printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);
}
}
结果:
7.关于数组的计算
1.sizeof(数组名)—— 数组名在此时表示整个数组,sizeof(数组名)表示计算整个数组的长度,单位为字节
2.&arr ——-数组名在此时表示整个数组 ,&arr表示取出整个数组的地址,其值与与数组首个元素地址相同,但性质不同
3.除此之外,所有遇到的数组名都是首元素的地址
8.数组作为函数参数
1.数组作为函数参数的时候,不会把整个数组传递过去,实际上只是把数组首元素的地址传过去,所以在函数参数部分中写成数组的形式如:int arr[]
,表示的依然是一个指针int *arr
。
2.所以如果需要计算数组长度不能在将数组作为参数的函数中计算,那样sizeof(数组名)计算出的是数组首元素的地址大小,而不是整个数组的大小
3.故在将数组作为函数参数时,一般会先计算出数组大小,将其作为参数与数组一起传递过去