一维数组创建与初始化
创建
int arr[10];
int a = 10;
int arr[a];//创建失败,[]里不能使用变量
char arr[10];
double arr[10];
初始化
有以下几种数组
int arr1[20] = {1,2,3};
int arr2[] = {1,2,3};
char arr3[] = "abc";
char arr4[] = { ' a' , 'b' , 'c'};
char arr5[] = {'a', 98, 'c'};
arr1为不完全初始化,剩下的默认初始化为0
arr5中的98,在ASCII码中是b
一维数组使用
[],下标引用操作符。
代码:
#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int i =0;
for(i=0;i<10;i++}
{
printf("%d ",arr[i]);
}
return 0;
}
1、数组是使用下标来访问的,下标是从0开始。
2、数组的大小可以通过计算得到。
如
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
二维数组的创建与初始化
如
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11};
int arr[3][5] = { {1,2}, {3,4},{5,6}};
int arr[][5] = { {1,2}, {3,4},{5,6}};
int arr[3][] = { {1,2}, {3,4},{5,6}};//错误,能省略行,但不能省略列
二维数组的使用
跟一维数组差不多
如
#include<stdio.h>
int main()
{
int arr1[3][5] = { 1,2,3,4,5,6,7,8,9,10,11 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
printf("%d ", arr1[i][j]);
}
return 0;
}
二维数组在内存中的储存
代码
#include<stdio.h>
int main()
{
int arr1[3][5] = { 1,2,3,4,5,6,7,8,9,10,11 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
printf("arr1[%d][%d]=%p\n", i,j,&arr1[i][j]);
}
return 0;
}
我们可以看到,数组中的每个相邻的元素的地址都是+4,因为该数组是int类型,一个元素占4个字节,所以二维数组在内存中也是连续储存的。其实在一维数组在内存中也是连续储存。
数组越界访问
代码:
#include<stdio.h>
int main()
{
int arr1[3] = { 1,2,3};
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
越界访问,但编译器不会报错
#include<stdio.h>
int main()
{
int arr1[3] = { 1,2,3};
int i = 0;
for (i = 0; i < 4; i++)
{
arr1[i] = 0;
}
return 0;
}
但当越界修改数组时,编译器会报错
数组名
#include<stdio.h>
int main()
{
int arr[10] = { 1,2.3,4,5 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%p\n", &arr);
printf("分割\n");
printf("%p\n", arr+1);
printf("%p\n", &arr[0]+1);
printf("%p\n", &arr+1);
return 0;
}
第1、2、3行都是指数组首元素的地址,但arr与&arr[0],&arr的意义是不一样的。