数组的概念
数组是一组相同类型元素的集合
数组的创建
数组类型 数组名[数组个数]
例如 int num[2] 代表创建一个长度为2的 int 类型数组
注意,这个数组的长度,必须是常量,不可以是变量
数组的初始化
数组的初始化指的就是给数组放入一些初始值
int num[2] = {1,2};
求数组的大小
可以用 sizeof 函数求数组的大小
假设有一个整形数组
int num[] = {1,2};
求这个数组的长度,你可能会这么写
printf("%d\n", sizeof(num));
输出结果会是
结果不对,你可能会好奇为什么不对,这跟 sizeof 函数本身有关, sizeof 函数求出的是传入参数的占用空间大小,换言之,求的是这个 长度的 int 类型数组的占用空间大小,如果我们要真的拿到这个数组的长度,那就需要除以这个数组类型的单个长度大小,其实严格来说,sizeof不属于函数,属于操作符应该,不然你试试,你在函数库找不到这个 sizeof 函数的
printf("%d\n", sizeof(num)/sizeof(int));
这里顺便一提,如果相求字符串本身的长度的话,与整形数组的不一致,字符串的可以直接用 strlen 函数求,因为字符串涉及到最后有一个 \0,所以就算用 sizeof(字符串数组)/sizeof(char) ,结果也是不对的,而 strlen 只会取 \0 之前的内容
打印数组
比如定义两个数组另一个 int 类型,一个字符串
int num[] = {1,2};
char username[] = "root";
打印他们的长度,先打印这个字符串吧
printf("%s\n", username);
然后来打印这个num
printf("%d\n", num);
你是不是会这么写,这么写就错了,整形的打印,不能这么写,需要写一个循环去遍历
int i = 0;
for (i = 0; i < sizeof(num)/sizeof(int); ++i) {
printf("%d\n", num[i]);
}
数组在内存中的存放是连续的
我们创建一个数组,打印它的地址值看看
#include <stdio.h>
#include <string.h>
#include "method.h"
int main() {
int num[] = {1,2,3,4,5};
int i = 0;
for (i; i < sizeof(num) / sizeof(int); ++i) {
printf("%p\n", &num[i]);
}
}
是不是地址值查了4?4是什么,4不就是一个int占得大小么?如果不信,我们再打印个字符数组
#include <stdio.h>
#include <string.h>
#include "method.h"
int main() {
char num[] = {'a','b','c'};
int i = 0;
for (i; i < sizeof(num) / sizeof(char ); ++i) {
printf("%p\n", &num[i]);
}
}
16进制9下来就是A,没错吧?
数组的维度
数组是比较灵活的,可以有一维数组,当然也可以有二维数组
比如 int message[2][3]; 就是创建一个 2 行, 3 列的二维数组
二位数组的创建及初始化
int message[2][3] = {{1,2,3},{4,5,6}};
我们看看这个数组是什么样的
这就是二维数组的创建和初始化,二维数组,无非就是数组元素是数组而已
二维数组的使用
二维数组的使用也是通过下标的形式进行使用的,比如我更改一个元素的值
int message[2][3] = {{1,2,3},{4,5,6}};
message[1][1] = 9;
printf("%d\n", message[1][1]);
遍历二维数组
#include <stdio.h>
#include <string.h>
#include "method.h"
int main() {
int message[2][3] = {{1,2,3},{4,5,6}};
int i = 0;
for (i = 0; i < 2; ++i) {
int j = 0;
for(j; j < 3; ++j) {
printf("%d\n", message[i][j]);
}
}
}
当然,也可以直接通过下表找到某个值,比如上面我更改的一个值
二位数组的地址
还有一个有趣的事情(当然可能只是我个人觉得有趣),二维数组元素的地址
仔细看,是不是每一个都是递增的,相差类型的占位?
二维数组在内存中的存放
在我们的理解中,二维数组是这样的(画图丑请忽略,不是专业画图的,假嘎玛噶的有那么个意思就行....)
但是你想想地址值,这玩意应该是连续的,也就是说,应该是这样的~