C语言数组详细介绍

目录
  • 什么是数组
  • 一维数组
  • 二维数组
  • 数组越界
  • 数组名
  • 结尾

什么是数组

数组(Array)是一种用来存储同一种类型的集合,是一种有序的线性结构表。并且数组元素的地址是连续的。

数组最大的优点就是支持随机访问,当想访问数组的某个数时,只需要找到数组的对应下标就可以直接找到该数组对应元素。但是数组也有相应的缺点,那就是数组的元素个数和数组空间大小在创建时就已经被固定死了,如果数组的空间没有使用完也会造成空间浪费,并且因为数组的地址是连续的,这本应该是一个优点的,但是这导致数组在进行删除或增加元素时需要O(n)才能完成。

数组的下标

数组下标是从0开始的,假设,访问arr[5]元素时,访问的是数组的第6个元素,访问arr[0]时,访问的是数组的第一个元素。

一维数组

一维数组创建

一维数组是常见的数组,创建方法是:数据类型 + 数组名 [ 元素个数 ];

int arr[10];

C99的标准之前,当数组在创建时,方括号内的数组元素个数只能是常量,使用的常量也必须是真正意义上的常量,比如用const修饰的变量有了常属性,但不是真正意义的常量,而由define定义的常量可以用来做数组元素个数。而C99之后数字方括号内的元素可以使用变量,而使用变量的做数组元素个数的数组,叫做变长数组。

一维数组初始化

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//整形数组
int arr[] = {0}//不指定大小但必须初始化
char ch[10] = {'1','2','3'};//字符数组
char str[10] = "abcde";//字符串数组

一维数组的赋值

用循环变量访问数组下标,给数组进行赋值。%s对应的是输入一个字符串,需要提供一个字符数组来存储,数组名是一个地址,所以不用加&取地址。

int arr[10] = {0};
for(int i = 0;i < 10;i++)
{
    scanf("%d",&arr[i];
}

char str[10] = {0};
scanf("%s",str);//字符串赋值可以不取地址和循环

一维数组在内存的存储方式

一维数组的元素地址是连续的,也就是元素的地址一个紧挨着一个。地址在内存是以二进制进行存储的,但是如果以二进制来展示的话就会非常的长而且也未必好理解,所以就由十六进制来进行展示。(下图)观察下图可发现,地址的是由低到高随着下标增长而增长的,有规律的递增,且每个数组元素地址都相差了四个字节,相差的四个字节是一个int整形的空间大小。

二维数组

二维数组在我们的逻辑概念中可以是一个矩阵,但在内存中与一维数组一样是一个连续的地址空间。通常我们将二维数组的第一个方括号看做行,第二个方括号看做是列。

二维数组的创建和初始化

二维数组与一维数组只是多加了一个方括号。数据类型 + 数组名[元素个数][元素个数];

int arr[3][3] = {1,2,3,4};//4自动存到arr[1][0]的位置
int arr[3][3] = {{1,2,3},
                 {4,5,6},
                 {7,8,9}};//一个大括号代表一行,每个大括号以逗号隔开
int arr[][3] = {0};//二维数组可以不初始化行,但必须初始化列

二维数组的赋值

给二维数组赋值,与一维数组一样都需要循环来搞定,但是二维数组需要在一维数组的循环基础上再嵌套一层循环。

int arr[3][3] = {0};
for(int i = 0;i < 3;i++)
{
    for(int j = 0;j < 3;j++)
    {
        scanf("%d",&arr[i][j]);//i访问行,j访问列
    }
}

数组越界

数组的下标范围是有限的,因为数组的下标是由0开始的,所以数组能访问的的下标就是数组元素个数减一个(N-1),当访问了不属于数组元素地址范围的空间,就叫做数组越界。假设一个arr[10]的数组,当访问下标时大于等于10的时候,就会导致数组向后溢出,也叫下溢出,相对的,当数组向数组第一个元素的前面越界访问时,也就是下标小于0,就叫上溢出,越界访问是非常危险的一个操作,因为有的编译器没有检查数组是否越界的功能,所以,当程序员在写代码所以数组时,要非常注意数组是否存在越界问题。二维数组的行和列也同样

数组名

数组名是指向数组首元素地址的指针,即下标为0的元素的地址的指针。上面说,由于数组的地址是连续的,所以当找到数组的首元素就可以找到数组的其他成员。如果用sizeof(数组名),这里的数组名代表的是整个数组,计算的是整个数组的大小。再除以sizeof(下标为0的地址),就可以得到数组的元素个数。

数组的传参方式

当要将数组作为函数参数进行传参时,需要在函数的传参位置放一个数组名,形参部分就会接收到一个数组的首元素地址的指针,而接收这个指针就也需要同类型的指针。在形参部分,数组可以有两种形式表示,一种是以数组的形式,一种是以指针的形式,两种方式都可以对数组进行传参。

void bubble_sort(int arr[])
void bubble_sort(int* arr)

当数组在传参之后,函数部分是不能计算数组的元素个数的。因为形参接收的只是一个数组的首元素地址的指针,而不是整个数组,计算数组的时候也只是计算了数组的首元素地址的大小,然后再除以首元素地址的大小,所以理所当然的得到一个1。所以,当数组需要传参,并且还需要用到数组的元素个数时,要先计算好数组元素个数,将计算好的元素个数和数组一起传参。

结尾

数组其实不只有一维和二维数组,还有三维数组甚至更高维,但是在情况下很少会用到,而且对于初学者用到二维数组就已经足以。

到此这篇关于C语言数组详细介绍的文章就介绍到这了,更多相关C语言数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中数组的使用详解

    目录 1 数组的基本概念 2 数组定义语法 3 一维数组的初始化 3.1 全部初始化 3.2 部分元素赋初值 3.3 省略长度赋初值 4 一维数组的使用示例 4.1 求最大值.最小值.平均值 4.2 数组逆置 4.3 数组排序 4.3.1 冒泡排序 4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置. 4.3.3 直接插入排序 5 二维数组 5.1 二维数组的概念 5.2 二维数组的初始化 5.2.1 全部初始化 按行全部赋初值 5.2.2 部分初始化 5.2.3 省略长度

  • 详解C语言初阶之数组

    目录 1.数组 1.1数组的概念 1.2数组的定义 a:完全初始化 b:不完全初始化 c:给定元素个数 d:不给定元素个数 1.3数组的下标访问 总结 1.数组 1.1数组的概念 所谓数组(array),就是具有相同数据类型的集合,存放的数据类型即数组本身的类型. 可以发现存储的都是int型 补充 :调试小技巧 调试窗口 (按F5进行调试,打开菜单栏中的调试-窗口-监视-随便打开一个监视窗口,输入arr,将程序运行过arr的初始化即可观察到arr内部进行的初始化) 1.2数组的定义 a:完全初始

  • C语言初阶之数组详细介绍

    目录 插入排序讲解 二维数组 二维数组的初始化 二维数组的访问 n维数组 字符数组 字符数组和字符串 字符数组的输入输出 字符串函数的简单使用 综合使用字符串函数 总结 插入排序讲解 #include<stdio.h> int main() { int arr[8] = { 1,2,3,4,6,7,10 }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int n = 0; scanf("%d", &n); f

  • c语言的指针数组详解

    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = &arr[0];//此句也可以写成 p = arr: for(int i=0;i<3;i++) { printf("第%d个元素值为:%d\n",i,*(p+i)); /*应注意这里指针的定义类型:p+i并不是指p的地址+1, 而是偏移一个类型的字节数,这里的类型是int,所以偏移4个字节*

  • C语言数组详细介绍

    目录 什么是数组 一维数组 二维数组 数组越界 数组名 结尾 什么是数组 数组(Array)是一种用来存储同一种类型的集合,是一种有序的线性结构表.并且数组元素的地址是连续的. 数组最大的优点就是支持随机访问,当想访问数组的某个数时,只需要找到数组的对应下标就可以直接找到该数组对应元素.但是数组也有相应的缺点,那就是数组的元素个数和数组空间大小在创建时就已经被固定死了,如果数组的空间没有使用完也会造成空间浪费,并且因为数组的地址是连续的,这本应该是一个优点的,但是这导致数组在进行删除或增加元素时

  • Go语言数据类型详细介绍

    目录 一.Go 语言两大数据类型 二.基础类型 三.复合类型 指针 四.数组(array) 五.切片(slice) 六.字典/映射(map) 七.通道(channel) 八.结构体(struct) 九.接口(interface) 十.错误(error) 一.Go 语言两大数据类型 Go 语言数据类型包含基础类型和复合类型两大类. 基础类型包括: 布尔类型 bool. 数值类型 int,int8,int16,int32,int64,float32,float64. uint8,uint16,uin

  • C语言 超详细介绍与实现线性表中的带头双向循环链表

    目录 一.本章重点 二.带头双向循环链表介绍 2.1什么是带头双向循环链表? 2.2最常用的两种链表结构 三.带头双向循环链表常用接口实现  3.1结构体创建 3.2带头双向循环链表的初始化  3.3创建新节点 3.4尾插 3.5打印链表 3.6头插 3.7尾删 3.8头删 3.9查找data(返回data的节点地址) 3.10在pos位置之前插入节点 3.11删除pos位置的节点 四.实现接口总结 五.在线oj训练与详解 一.本章重点 带头双向循环链表介绍 带头双向循环链表常用接口实现 实现接

  • C语言 超详细介绍与实现线性表中的无头单向非循环链表

    目录 一.本章重点 二.链表介绍 三.无头单向非循环链表常用接口实现 3.1动态申请一个节点 3.2单链表打印 3.3单链表尾插 3.4单链表的头插 3.5单链表的尾删 3.6单链表头删 3.7单链表查找 3.8单链表在pos位置之前插入x 3.9单链表删除pos位置的节点 四.在线oj训练 4.1移除链表元素(力扣) 4.2反转单链表(力扣) 一.本章重点 无头单向非循环链表介绍 无头单向非循环链表常用接口实现 在线oj训练 二.链表介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构

  • C语言 数据类型详细介绍

    C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 1 基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型. 2 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量. 3 void 类型: 类型说明符 void 表明没有可用的值. 4 派生类型: 它们包括:指针类型.数组类型.结构类型.共用体类型和函数类型.

  • C语言 运算符详细介绍及示例代码

    C 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本章将逐一介绍算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和其他运算符. 算术运算符 下表显示了 C 语言支持的所有算术运算符.假设变量 A 的值为 10,变量 B 的值为 20,则: 运算符 描述 实例 + 把两个操作数相加 A + B 将得到 30 - 从第一个操作数中减去第二个操作数 A

  • 详细介绍Go语言之数组与切片

    目录 一.数组 1.数组的定义 2.数组赋值 3.定义并初始化 4.数组的大小是类型的一部分 5.数组是值类型 6.数组长度 len() 数组长度在定义阶段已经固定 7.数组循环 8.多维数组 9.数组定义并指定位置初始化 二.切片基础 1.切片的定义 2.使用切片 3.修改切片,会影响数组 4.修改数组也会影响切片 5.切片只切数组的一部分 6.当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中 7.切片的长度和容量 8.切片追加值 一.数组 数组是同一类型元素的集合,可以放多个

  • C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识. 1.strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str2[]={"China"}; strcpy(str1,str2); strn

  • C语言超详细讲解轮转数组

    目录 题目描述 实例 解题思路 1. 先整体逆转 2.逆转子数组[0, k - 1] 3.逆转子数组[k, numsSize - 1] 易错点 代码 题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数.OJ链接 实例 1.实例1 输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7

随机推荐