c语言分层理解(c语言数组)(1)

简介: 1. 一维数组的创建和初始化首先,我们要知道数组是相同类型元素的集合。1.1 一维数组的创建type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式,用来指定数组的大小123在创建时我们所碰到的问题1. 数组[]中能不能是一个变量

1. 一维数组的创建和初始化

首先,我们要知道数组是相同类型元素的集合。

1.1 一维数组的创建

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

在创建时我们所碰到的问题

1. 数组[]中能不能是一个变量

这是在visual studio 2022中的情况:

13396dce89837118d0d6f185a6561b02.png

在visual studio 2022中我们看见它是不行的,实际上数组[变量]这种语法是c99标准中的,它叫变长数组。很明显,visual studio 2022不支持c99版本。

在支持c99标准的编译器下是可以运行的,并不会报错。

2. 数组创建时可不可以不给数组指定大小


1ff82be8bfbf53f580ac17101d12cca0.png

这是不行的,创建的时候必须指定空间大小。,不然会报错。

3. 数组空间太大栈区会放满

f4e4dd3bdefd9eb762c74f22d4dee3dd.png

4. 补充

int arr[2+3]//这种语法是对的,[]中可以是表达式
char arr1[2 + 3];
int arr2[2 + 3];
int arr3[3 + 2];//加法支持交换律
float arr4[4 + 3];
double arr5[5 + 3];
//以上都是正确的,不用质疑

注意:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化

1.2 一维数组的初始化

首先了解初始化和赋值的意思:

int a = 0;//这叫初始化
int n;
n = 20;//这叫赋值

初始化是创建变量的同时给定一个数值。

赋值是创建变量之后对这个变量给定一个数值

重点放在初始化是同时进行,赋值是一前一后进行

一维数组初始化常见问题罗列

1. int arr[] = {1,2,3}写法可以吗?

这种写法是可以的。

f9069c3b55daccca8291631846aa7711.png

arr数组中存放的是123,这里没有给定空间大小,数组就自动根据元素个数给定这个数组大小。这个数组的空间大小是12。

2. int arr[10] = {1,2,3,4,5}写法可以吗?

这种写法是没有问题的,这个叫做不完全初始化。


0b7388747d3b69b2016c87ed9f339727.png

这个数组中存放的是1234500000,说明了初始化不完全,编译器会自动给其初始化为0,这里的数组空间大小是40,原因是我们规定了数组大小。

3. 看看char arr1[] = "abc"和char arr2[] = {‘a’,‘b’,‘c’}的区别

9bd5f90cdc58b9b97254d8dd00b8fa7b.png

这里我们发现,arr1中有四个元素,arr2中有三个元素,说明arr1的空间大小是4,arr2的空间大小是3。

理解了这点再来看看char arr3[10] = "abc"和char arr4[10] = {‘a’,‘b’,‘c’}的区别:

78ed22de324612150946966e8c1972ce.png

这里我们看到的是一样的,其实并不是,上面我们已经验证了char arr1[] = “abc”,arr1中包含的是a,b,c,\0,arr2中包含a,b,c,这里虽然arr3和arr4看起来一样,但是不同,arr3中其实是a,b,c,\0,0,0,0,0,0,0,arr4中其实是a,b,c,0,0,0,0,0,0,0,这就能解释为什么不一样的原因了。

2. 一维数组的使用

对于数组的使用我们知道[]是一个下标引用操作符,其实就是数组访问的操作符。我们之前提到一个交换律的概念,如:2+3可以写成3+2,一个双目操作符的两个操作数是可以交换的,数组中的两个操作数在某些场景中也是可以交换的,如:

#include <stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5 };
  int i = 0;
  for (i = 0; i < 5; i++)
  {
    printf("%d ", i[arr]);
    //printf("%d ",arr[i]);
  }
  return 0;
}

总结:

1.数组是使用下标来访问的,下标是从0开始的。

2.数组的大小可以通过计算得到

int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

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

还是先看现象再看实质;

62066fcdbc382d74b78f82add8c5f13e.png

通过这段代码我们发现地址都是隔4个字节的大小,说明一维数组在内存中是连续存放的。随着数组下标的增长,地址也是由低地址到高地址变化。















相关文章
|
17天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
33 6
|
21天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
27天前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
24天前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
28天前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
27天前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
16 0
保姆式教学C语言——数组
|
29天前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
22 1
|
26天前
|
C语言
C语言数组
C语言数组
16 0
|
27天前
|
存储 C语言 索引
c语言回顾-数组(全网最详细,哈哈哈) (下)
c语言回顾-数组(全网最详细,哈哈哈) (下)
42 0
|
27天前
|
存储 编译器 C语言
c语言回顾-数组(全网最详细,哈哈哈)(上)
c语言回顾-数组(全网最详细,哈哈哈)(上)
55 0