深入浅出C语言——数组

深入浅出C语言——数组_第1张图片

文章目录

  • 一、数组概念
  • 二、一维数组
    • 1. 一维数组的创建
    • 2. 一维数组的初始化:
    • 3. 一维数组的使用
    • 4. 一维数组在内存中的存储
  • 三、二维数组的创建和初始化
    • 1. 二维数组的创建
    • 2. 二维数组的初始化
    • 3. 二维数组的使用
    • 4. 二维数组在内存中的存储
  • 四、数组越界
  • 五、数组作为函数参数


一、数组概念

  变量虽然可以存储数据,但是存放的效率太低了,于是就产生了数组,用来存放一组相同类型的数据。简言之,数组是一组相同类型元素的集合


二、一维数组

1. 一维数组的创建

数组的创建方式:

type_t      arr_name       [const_n];
元素类型      数组名       指定数组的大小

深入浅出C语言——数组_第2张图片

  在C99标准之前, [ ] 中需要输入常量才可以,不能使用变量。在C99标准中,C语言支持了变长数组,允许数组的大小用变量来指定。但是如果编译器不支持C99中的变长数组那就不能使用。另外,在C语言中,cosnt修饰的n叫常变量,是变量,也不能用它来指定数组的大小。而在C++中,const修饰的变量就是常量。


2. 一维数组的初始化:

  数组的初始化是指在创建数组的同时给数组的内容一些合理初始值。数组在创建的时候如果想不指定数组的确定的大小就需要进行初始化,此时数组的元素个数根据初始化的内容来确定。另外,不能在定变长数组时,进行初始化操作。

深入浅出C语言——数组_第3张图片

  字符数组的初始化与数值型数组初始化没有本质区别,但它除了可以逐个给数组元素赋予字符外,也可以直接用字符串对其初始化。

在这里插入图片描述
   在C语言中,全局变量、静态变量未初始化默认赋值为0,因为这两者会放到静态区中。栈区的局部变量和形式参数,不初始化就是随机值。本质上放在了不同的区域,初始化赋值是不一样的。


3. 一维数组的使用

  数组可以通过[]下标引用操作符进行访问,从而进行使用。下标从0开始,arr[i]是访问数组的一个元素,i是用来指定数组的下标,使用变量是没有问题的。

深入浅出C语言——数组_第4张图片


4. 一维数组在内存中的存储

  打印数组的地址,可以发现,随着数组下标的增长,元素的地址,也在有规律的递增。从而得出结论:一维数组在内存中是连续存放的

深入浅出C语言——数组_第5张图片

   %p表示打印的是地址。每相邻两个元素之间的地址差4,因为一个整型的大小是4。int* p = &arr[0]; p+1是跳过了四个字节,也就是一个整形。


三、二维数组的创建和初始化

1. 二维数组的创建

int arr[3][5] = {1,2,3,4,5,6};//不完全初始化一个三行五列的二维数组

在内存中的存储位置:
深入浅出C语言——数组_第6张图片

   二维数组的不完全初始化时,未初始化的元素默认为0。另外,C语言本身是支持多维数组的,但其实很少能用到,例如:int[3][4][5]


2. 二维数组的初始化

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

3. 二维数组的使用

   二维数组的使用和一维数组类似,行和列也是从0开始,并且通过下标访问操作符[]进行访问。
   求二维数组的行:sizeof(arr) / sizeof(arr[0])
   求二维数组的列:sizeof(arr[0])/sizeof(arr[0][0])


4. 二维数组在内存中的存储

   通过打印二维数组中元素的地址可知,二维数组的元素在内存中也是连续存储的。
深入浅出C语言——数组_第7张图片
存储方式:
深入浅出C语言——数组_第8张图片


四、数组越界

   数组的下标是有范围限制的,如果数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
深入浅出C语言——数组_第9张图片

   在C语言中,数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。另外,C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。不仅一维数组存在越界,二维数组的行和列也可能存在越界。


五、数组作为函数参数

深入浅出C语言——数组_第10张图片

   在写代码的时候,经常会将数组作为参数传给函数。以上述的冒泡排序为例,可以看出数组名就是数组首元素的地址


例外情况:

  1. sizeof(数组名),数组名不是数组首元素的地址,而是整个数组
  2. &数组名,数组名不是数组首元素的地址,数组名表示整个数组,取出的是整个数组的地址。
    深入浅出C语言——数组_第11张图片
       通过验证可以发现,&数组名+1就是跳过了整个数组。除此这两种情况之外,所有的数组名都表示数组首元素的地址。

你可能感兴趣的:(C语言,c语言,开发语言,visual,studio)