您现在的位置是:首页 >技术教程 >C learning_11 (数组和在内存存储的理解、数组越界、数组作为形参)网站首页技术教程
C learning_11 (数组和在内存存储的理解、数组越界、数组作为形参)
目录
数组的理解
数组的含义
在C语言中,用于存储多个相同类型的元素。它可以被简单地定义为包含多个元素的容器。数组中每个元素都可以通过索引来访问,索引从零开始递增。 C语言中的数组可以包含任何基本数据类型,例如整数、字符、浮点数等。要定义一个数组,需要指定数组的类型和元素的数量。
数组的创建
type_t arr_name [const_n];
type_t 是指数组的元素类型
const_n 是一个常量表达式,用来指定数组的大小
例如:
int a[5];
char c[2];
double* ptr[10];
数组创建的其他几种实例情况
#include<stdio.h>
#define COUNT 10
enum Count {
Count = 10,
};
int main()
{
//写法一
int count = 10;
int arr[count];
//写法二
const int count = 10;
int arr[count];
//写法三
int arr[COUNT];
//写法四
int arr[Count];
return 0;
}
以上代码中包含了4种不同的数组定义方式,分别如下:
1. 使用变量定义数组大小:
```
int count = 10;
int arr[count];
```
此种方式定义数组的长度使用的是一个变量,变量count的值为10,因此定义了一个包含10个元素的数组。
但需要注意的是,在博主的vs编译器中,采用的是C90的标准(数组大小只能是常量表达式),并不支持C99的标准(引入变长数组的概念,使得数组在创建的时候可以使用变量,但是不可以被初始化),所以这样的变量长度的数组会被编译器判定错误。
而在gcc编译器环境下,它是支持C99标准的特性,就允许这样的写法。
2. 使用常量定义数组大小:
```
const int count = 10;
int arr[count];
```
此种写法只是将变量count改为了常量count,但是count还是常量,只不过它拥有了常量属性,本质还是变量,原因和第一种方法相同。
3. 使用宏定义定义数组大小:
```
#define COUNT 10
int arr[COUNT];
```
通过宏定义,我们将数组大小定义为一个常量,因此在整个程序中都可以使用宏定义的值。此种方式定义的数组大小,与使用常量定义的数组大小基本相同。
4. 使用枚举定义数组大小:
```
enum Count
{
Count = 10,
};
int arr[Count];
```
使用枚举定义数组大小与使用宏定义相似,只不过使用的是枚举类型。其中,我们定义了一个名为Count,值为10的枚举常量,然后通过Count来定义数组大小。最终,以上四种方式定义的数组类型都是相同的,都定义了一个包含10个元素的数组。
总结:数组创建,在C99标准之前,[ ]([ ]内的值必须是整型)中要给一个常量、宏定义或者枚举常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。
数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
int arr1[5] = {1,2,3,4,5};//完全初始化
int arr2[10] = {1,2,3};//不完全初始化,剩余的元素都是0
int arr3[] = {1,2,3,4};//省略数组的大小,数组会根据初始化的内容来确定
int arr4[3] = {0};//省略数组的内容,就必须要指定数组的大小
//下面解释
char arr5[] = {'a','b','c'};
char arr6[] = "abc";
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
现在我们来看数组中字符数组在创建为什么有两种形式(char arr5[] 和 char arr6[ ] ),以及在内存是怎么分配的。
```
char arr5[] = {'a','b','c'};
```
这种方式就是简单的使用{ }进行初始化 。
```
char arr6[] = "abc";
```
这种创建char数组的方式叫做字符串字面值初始化,可以简化char数组的定义和初始化。
由两张图我们可以得出:
第二种写法等价于:
```
char arr6[] = {'a', 'b', 'b', '