掘根宝典之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

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

《纳瓦尔宝典》是纳瓦尔·拉维坎特(Naval Ravikant)的智慧箴言

《纳瓦尔宝典》是一本由埃里克·乔根森(Erik Jorgensen)编著的书籍,该书于2022年5月10日由中信出版社出版。这本书的核心内容围绕硅谷知名天使投资人纳瓦尔·拉维坎特(Naval Ravikant)的智慧箴言,特别是关于财富积累和幸福人生的原则与方法。 晓北斗推荐 《纳瓦尔宝典》 基本信息 书名:《纳瓦尔宝典》作者:[美] 埃里克·乔根森译者:赵灿出版时间:2022

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非