C语言:数组

1.一维数组

数组是一组相同类型元素的集合。

1.1一维数组的创建:

type_t   arr_name   [ const_n ];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

1.2一维数组的初始化

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

一维数组的初始化我们要学会区分下面的代码:
char ch1[] = { 'a','b','c' };
    char ch2[] = "abc";

两段代码看似是一样的,但是其实暗藏玄机。调试看看:

可以发现在内存分配的时候,ch2多了一个'\0'。所以我们可以推测输出这两个数组的情况,printf遇到'\0'才会停止,所以前一个数组会输出我们预想不到的值。

1.3一维数组使用

一维数组最常见的使用就是通过下标访问数组元素,数组下标是从0开始的。

1.4一维数组在内存中的存储

为了方便了解一维数组在内存中的存储情况,我们创建一个一维数组,打印它的地址看看:

 

经过观察可以发现数组每个元素的地址都是相差一个int整型大小,所以数组在内存中是连续存放的。

2.二维数组

2.1二维数组的创建

//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];

2.2二维数组的初始化

//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略

2.3二维数组的使用

二维数组同样也是通过下标来访问数组元素。

2.4二维数组在内存中的存储 

打印每个元素的地址

 

在我们的认识里二维数组更像一个矩阵,这是逻辑上的。其实在图中我们可以发现,内存中二维数组就是连续存放的。 

 3.数组越界

 图中数组元素只有10个,我却要打印11个元素,这样访问下标就形成了越界。编译器并没有报错,只是输出了一个随机数。

编译器没有报错并不意味这没有产生问题,我们应该自己检查数组是否发生越界。

4.练习

冒泡排序

4.1错误写法

在第一次写这个冒泡排序的时候,我把计算数组大小的sz写在了函数里,在运行代码后并没有实现我想要的排序效果,如下图: 

 

在调试过后可以发现这样的写法sz计算出的结果是2,才导致后面的排序产生了问题。

 

原因是数组作为函数参数传递后,其实传递的是指针,指针类型作为存储数据地址的变量类型,其大小受计算机总线制约,而64位系统指针大小位8字节,故sizeof(指针)结果为8 ,后面的arr[0]为一个元素的大小是4,所以算出来是2。

那么就引发了困惑,数组名到底代表了什么???

 数组名其实是数组首元素的地址。

有两个例外:

1. sizeof( 数组名 ) ,计算整个数组的大小, sizeof 内部单独放一个数组名,数组名表示整个数
组。
2. & 数组名,取出的是数组的地址。 & 数组名,数组名表示整个数组。

 

 

 

 

 

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值