一维数组
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
char ch[] = { 'a','b','c','d' };
return 0;
}
上面是两个数组,其中第一个数组有7个元素,第二个数组有4个元素。打开调试窗口,
可以清晰地看到里面的元素。
一维数组初始化
这是完全初始化,arr[8]={1,2,3,4,5,6,7,8},其中8个元素都赋予了初始值。
这是不完全初始化,也就是说arr中本应该放置10个元素,但只初始化了8个,打开调试窗口,选择监视。
可以看到,不够的元素都放置0,而ch数组放置\0,\0的ASCII值为0,'a'为97。
如果不输入元素的个数,那么编译器会自动根据初始化的元素个数来确定元素个数。
一维数组的访问
1. 数组是有下标的,下标是从0开始的
2. [] 下标访问操作符
其中arr[0]代表数组中的第一个元素。
清晰的展现了元素与下标。
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
char ch[] = { 'a','b','c','d','e' };
printf("%d ", arr[0]);
printf("%d ", arr[1]);
printf("%d ", arr[2]);
printf("%d\n", arr[3]);
printf("%c ", ch[0]);
printf("%c\n", ch[2]);
int i = 0;
int j = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i <= j - 1; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
for循环实现数组的打印。
一维数组在内存中的储存
后面分别为第一到第四个元素的地址;
调试窗口,可以看到他们的地址。之间相差4个字节,因为是整型类型。而且每次输出的地址会不一样。
打开调试内存。
可以看到内存中的地址和调试窗口监视中的一样。
可以看出内存中的地址从下到上是逐渐变小的,也就是上图的高地址到低地址。arr[0]的地址为007BF884,arr[1]的地址为007BF884。均为内存单元的首位地址。
下面一一打印所有元素的地址。
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
char ch[] = { 'a','b','c','d','e' };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int* p = &arr[0];
for (i = 0; i < sz; i++)
{
printf("%p\n", p + i);
}
return 0;
}
运行结果为
二维数组
先认识一个简单的二维数组。
arr[3][4],表示三行四列,打开调试窗口监视
可以看到每一行有四个元素。
二维数组的访问
如何锁定二维数组中的一个元素呢?可以这样理解。
比如说要数组中的元素7,那么它的位置就是第二行第三列,坐标可以认为(1,2),而可以这样表达arr[1][2],这就锁定了这个元素。
输出所有元素
#include<stdio.h>
int main()
{
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
二维数组的初始化
上面的arr[3][4]数组为完全初始化。下面为几种非初始化的二维数组。
在二维数组中行数可以省略,但列数不能,确定列数和元素个数后,编辑器会自动确定行数的。上面都省略了行数。arr2[][4]中有7个元素,不够的用0补齐。
arr2[][4]中最后一个元素为0。
arr3的监视窗口是这样的。
可以理解为第一行只初始化了2个元素,剩下的2个由0补齐,第二行初始化了3个元素,最后一个由0补齐。
二维数组的内存储存
#include<stdio.h>
int main()
{
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%p\n", &arr[i][j]);
}
}
return 0;
}
元素的地址为:
这样的地址和上面的一维数组的地址有什么相同之处呢?都是按4个字节增加的。
其实二维数组的内存分布并不像上面类似于格子分布的,也是和一维数组一样,是并排分布的,什么意思呢?
类似于这样储存的,可以理解为行数又是一个类似于一维数组的数组。
这次的分享就到这里了,有错误或意见可以提出来。