掘根宝典之c语言一维数组

2024-03-02 19:44

本文主要是介绍掘根宝典之c语言一维数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是数组

数组是一种存储固定大小的相同类型元素的数据结构。

数组可以包含任意类型的元素,例如整数、浮点数、字符等。在内存中,数组通常是连续存储的,每个元素按照一定的间隔存储。

通过使用数组,可以有效地存储和访问一系列相同类型的数据。数组可以用于各种场景,例如存储学生的成绩、保存图像像素值等。

在C语言中,数组是一种重要的数据结构,并且具有高效的访问和操作特性。使用数组可以提高代码的可读性和可维护性。

一维数组

一维数组是指只有一个维度的数组,通常是一列或一行的数据元素组成。一维数组中的每个元素可以通过一个唯一的索引来访问。例如,一个包含5个整数的一维数组可以表示为 [1, 2, 3, 4, 5]。在许多编程语言中,一维数组可以通过定义一个变量名称和方括号([])来表示。

声明

C语言中的一维数组的声明方式为:

类型 数组名[大小];

其中,类型表示数组元素的数据类型,数组名表示数组的名称,大小表示数组中元素的个数。

例如,声明一个包含5个整数的数组:

int numbers[5];

指定数组大小

需要注意的是,数组的大小是固定的,声明后不能改变

如果需要动态的大小,可以使用指针和动态内存分配。 

数组大小只能用整型常量(strlen()和sizeof()的返回值被视为整型常量,const int在C语言不是整型常量,但是在C++是)或者整型常量表达式

#define we 10
int a[we];
int b[sizeof(int)];
int d[3+4];const int h=10;
int c[h];
//这在c语言是不可以的,但是在C++中是可以的

 如果不确定数组的大小,可以使用省略号来让编译器根据初始化列表的项数自动推断数组大小:

int arr[] = {1, 2, 3, 4}; // 编译器会自动推断数组大小为4

 

初始化

在C语言中,一维数组的初始化可以通过以下几种方式实现:

逐个赋值:

使用循环或直接为每个元素赋值的方式进行初始化。例如,我们可以使用以下方式初始化一个整数数组:

int arr[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;

使用大括号初始化列表:

可以使用大括号来直接为数组赋初值,元素之间用逗号分隔。例如,我们可以使用以下方式初始化一个整数数组:

int arr[5] = {1, 2, 3, 4, 5};

这种方式可以在数组创建的同时完成初始化,更加简洁。

部分初始化:

可以只为数组的某些位置指定初始值,其余位置将自动赋值为0。例如,我们可以使用以下方式初始化一个整数数组:

int arr[5] = {1, 2};

这样,数组的前两个元素分别为1和2,后三个元素自动赋值为0。

指定初始化

这个特性可能在某些编译器上不支持(比如VS2022)

C语言中,可以使用指定初始化器来为数组的指定位置赋初值,其余位置将自动赋值为0。
指定初始化器的语法是在大括号中指定每个元素的值,并用逗号分隔。

例如,我们可以使用指定初始化器来初始化个长度为5的整数数组

int arr[5] = {[1] = 2, [3] = 4};

上面的代码中,数组的前两个元素分别为1和2,第三个元素为3,第四个元素为4,而第五个元素将自动赋值为0。
你可以根据需要选择性地指定初始化器来初始化数组的指定位置,而不必为每个元素都提供初值。这样可以使代码更加清晰和简洁,

无论使用哪种方式,只要保证赋值的元素个数和数组的长度一致即可完成初始化。

注意

如果在数组初始化时,会发生以下情况:

  1. 如果初始化列表的项数小于数组元素个数,则多余的元素会被自动初始化为0。
int arr[5] = {1, 2, 3}; // arr[3]和arr[4]会被初始化为0

  1. 如果初始化列表的项数大于数组元素个数,则会导致编译错误。
int arr[3] = {1, 2, 3, 4}; // 编译错误,初始化列表的项数超过了数组元素个数

因此,要确保初始化列表的项数与数组元素个数相匹配,以避免潜在的错误。
 

访问

C 语言中,数组通常是顺序存储的,在内存中按照连续的地址存储。

这意味着数组的元素是紧密排列的,可以通过指针和索引进行高效的访问

可以通过下标来访问数组中的元素,下标从0开始

int a[5]={1,2,3,4,5};

例如,访问数组中的第一个元素:

a[0];//对应第一个元素
a[2];//对应第三个元素
a[4];//对应第四个元素

数组越界

在 C 语言中,数组的越界访问是一种错误的行为,指的是访问数组的索引超出了数组的有效范围。

这种行为是未定义的,会导致程序的不可预测行为,并且可能引发诸如程序崩溃、数据损坏、安全漏洞等问题。

例如,如果一个数组的大小为5,有效的索引范围是0到4。如果访问超出范围的索引,就会发生越界访问错误。

int arr[5] = {1, 2, 3, 4, 5};
int x = arr[10];  // 越界访问错误,arr 的有效索引范围是 0 到 4

为了避免越界访问错误,应该始终确保数组的索引在有效范围内。在编写代码时,应该特别注意循环和指针操作,以确保不会出现数组越界访问。

注意事项

1.声明数组时,[]内不能使用变量(但是可以定义变长数组)

也就是说,下面这种情况是不允许的

int a=9;
int b[a];

2.创建数组时既不给数组指定大小,也不初始化是不对的

int b[];//这是不对的

3.在创建数组时初始化数组

我们在创建数组时就应该养成初始化数组的习惯,

如果你想后面再对其进行赋值,那可以先将数组的值全设置为0;就像下面这么做

int b[10]={0};

4.不能把一个数组赋给另一个数组,可以把数组赋给指针 

下面这种操作是不行的

int a[2] = { 3 };
int b[2] = a[2];

下面这种操作是可以的

	int a[2] = { 3 };int* b = a;

 

数组名的意义

在 C 语言中,数组名表示数组的首地址。它是一个常量指针,指向数组中第一个元素的地址。

我们可以举个例子

int a[10];
int* const b=&a[0];

这样子数组名a和指针b几乎是一样的了 ,即b不能改变但是可以改变*b

数组名的意义主要体现在以下几个方面:

  1. 访问数组元素:可以使用数组名和索引来访问数组中的元素。例如,对于数组 int arr[5] = {1, 2, 3, 4, 5};,可以使用 arr[0]arr[1] 等来访问数组中的元素。

  2. 数组作为函数参数:当数组作为函数参数传递时,实际上传递的是数组的地址。因此,函数内部可以通过数组名来访问和修改数组的元素,对数组的修改会影响到原始数组。

  3. 指针运算:数组名可以被视为指向数组首元素的指针。因此,可以使用指针运算来处理数组。例如,arr + 1 表示数组第二个元素的地址,*(arr + 2) 表示数组第三个元素的值。

  4. 数组大小:使用 sizeof 运算符可以获取数组的大小。例如,sizeof(arr) 返回整个数组的大小(字节数),可以根据数组大小来进行内存分配和操作。

总之,数组名在 C 语言中具有指向数组首地址、访问数组元素、作为函数参数和指针运算等重要作用。它是与数组相关的重要概念之一。

指针创建一维数组

指针可以用来创建一维数组。创建一维数组的过程通常包括以下步骤:

  1. 声明指向数据类型的指针变量。
  2. 使用动态内存分配函数(例如malloc)为数组分配内存空间。
  3. 对数组进行赋值和操作。
  4. 使用完数组后,使用free函数释放内存空间。

下面是一个示例,展示如何使用指针创建一维数组:

#include <stdio.h>
#include <stdlib.h>int main() {int size;printf("Enter the size of the array: ");scanf("%d", &size);// 动态分配内存空间int* arr = (int*)malloc(sizeof(int) * size);// 检查内存分配是否成功if (arr == NULL) {printf("Memory allocation failed.\n");return 1;}printf("Enter the elements of the array:\n");for (int i = 0; i < size; i++) {scanf("%d", &arr[i]);}printf("The elements of the array are: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");// 释放内存空间free(arr);return 0;
}

在上述示例中,首先要求用户输入数组的大小。然后使用malloc函数为数组分配大小为size的内存空间。接下来,使用循环从用户获取数组的元素值,并打印出数组的元素。最后,使用free函数释放数组的内存空间。

请注意,在使用完数组后,务必记得释放动态分配的内存空间,以防止内存泄漏。

一维数组传参

一维数组可以作为函数参数传递给函数。在函数定义中,可以声明一个接收一维数组的形参,并在函数调用时将数组作为实参传递给该函数。

那我们怎么设计这个函数接口呢?

我们先以传下面这个数组为例

int a[10];

 我们要知道数组名代表数组首元素的地址,所以在设计参数时,我们不仅可以用数组形式表示,还可以用指针形式表示

所以以下四种函数接口设计都是等价的

int sum(int*ar);
int sum(int*);
int sum(int ar[]);
int sum(int []):

但是在函数定义中不能省略参数名,所以以下这两种函数函数定义等价

int sum(int*ar)
{
}
int sum(int ar[])
{
}

这篇关于掘根宝典之c语言一维数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767224

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1