数组概念:在内存中连续存储的具有相同数据类型的一组数据的集合 。
注意:
- 数组中的数据类型必须都是一致的
- 数组在内存中必须是连续的存储空间
- 定义数组的时候,[]里面的值不能是变量 , 只能是常量 。例如int num[n] 。
- 使用数组的时候 , []里面的值可以是常量也可以是变量 。例如已经定义了数组num[10],利用for循环遍历的时候可以用num[i]来遍历 。
![C语言基础--数组](http://img.zhejianglong.com/231018/21313L553-0.png)
文章插图
如图可以看出,数组元素在内存中的存储地址是连续的,尤其注意以下内容的区分 。
- a[0]代表第0个元素
- &a[0]代表的是第0个元素的地址,在本例中&a[0]=01
- 数组名a代表数组,也代表着第0个元素的地址--->a == &a[0] ==01 , 所以说数组名是一个常量(常量不能被赋值) , 也就是第0个元素的首地址 。
- &a代表整个数组的地址,在数值上 &a == &a[0] == a,但是意义上不同,&a代表的是整个数组的地址,而a和&a[0]是第0个元素的地址,下一条会介绍具体区别 。
- &a[0]+1 代表元素的地址+1,跨过一个元素,此时指向的是a[1]的首地址也就是05
- a+1 也代表元素的地址+1 , 跨过一个元素
- 而&a代表的是整个数组的地址,&a+1则表示跨过整个数组 , 此时地址变成21 , 这就是上面整个数组地址和第0个元素地址的区别,他们跨过的元素个数不同
一维数组初始化:在定义数组的同时进行赋值,成为初始化 。
- 全局数组如果不初始化,编译器将将数组元素初始化为0.
- 局部数组如果不初始化,内容将会是随机的 。
#include<stdio.h>int num1[5];int main(){ int num2[5]; for (int i = 0; i < 5; i++) {printf("%d ", num1[i]); } printf("\n"); for (int i = 0; i < 5; i++) {printf("%d ", num2[i]); } return 0;}
运行结果如下:![C语言基础--数组](http://img.zhejianglong.com/231018/21313GF8-1.png)
文章插图
注意:
- 若元素没有全部被赋值,那么未被赋值的元素默认会被赋值为0 。例如 int num[3]={1},那么此时num中的元素其实是 1,0,0 。
- []中不定义元素个数,定义的时候必须初始化,因为数组需要知道具体要开辟几个元素的空间 。例如int num[];int num[] = {1,2,3} , 此时num默认有三个元素,元素个数由{}里面的个数来定 。
![C语言基础--数组](http://img.zhejianglong.com/231018/21313J041-2.png)
文章插图
二维数组名【C语言基础--数组】int a[2] [3]
![C语言基础--数组](http://img.zhejianglong.com/231018/21313H525-3.png)
文章插图
- a[0] [0] 代表第0行第0个元素
- &a[0] [0]代表第0行第0个元素的地址,也就是01
- a[0]代表第0行一维数组的数组名 a[0] = &a[0] [0]
- &a[0]第0行的地址01
- a 二维数组数组名,代表二维数组,也代表首行地址 &a[0]
- &a 二维数组的地址
- &a[0] [0] +1 元素地址+1,跨过一个元素
- a[0] +1 元素地址+1,跨过一个元素
- &a[0] +1 行地址+1,跨过一行
- a+1 行地址+1 , 跨过一行
- &a + 1 二维数组地址+1,跨过整个数组
- 首先,在C语言中,没有字符串这种数据类型,C语言中的字符串其实上是char数组 。
- 在C++中有字符串类型,实际上是类模板 , 是一个类 。
- 字符串一定是一个char的数组,但是char数组未必是字符串 。
- 数组0(和字符串‘\0’等价)结尾的char数组就是一个字符串,但是如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通数组 , 所以字符串是一种特殊的char数组 。
#include<stdio.h>int main(){ char c[] = {'a','b','c'};//普通的字符数组 printf("%s\n", c);//乱码 , 因为没有'\0'结尾,用%s打印出错 //有'\0'结尾的字符数组就是字符串 char c1[] = { 'a','b','c','\0'}; printf("%s\n", c1); char c2[]= { 'a','b','c','\0' ,'d','e','f'}; printf("%s\n", c2);// \0后面的部分不会被打印 return 0;}
运行结果如下:![C语言基础--数组](http://img.zhejianglong.com/231018/21313KI6-4.png)
推荐阅读
- 累加和为 K 的子数组问题
- C++和Java多维数组声明和初始化时的区别与常见问题
- 可持久化数组 P3919 【模板】可持久化线段树 1
- LeetCode - 数组的旋转总结
- .NET源码学习 [算法2-数组与字符串的查找与匹配]
- LeetCode - 二维数组及滚动数组
- 1975属兔的最佳车牌号三位数组合 幸运车牌数字推荐?
- 2021年广东高考成绩如何计算 2023广东高考成绩分数组成+计算方式
- 12生肖最幸运手机号尾数 最热门的手机靓号数组?