C语言数组全面总结梳理

目录
  • 一,一维数组
    • 1.创建和初始化
    • 2.使用下标访问
    • 3.在内存中的存储
  • 二,二维数组
    • 1.创建和初始化
    • 2.使用下标访问
    • 3.在内存中的存储
  • 三,越界问题

数组(array)是由一系列类型相同的元素构成。

一般形式:

类型     数组名  [常量表达式]

一,一维数组

1.创建和初始化

创建一堆相同元素的集合,以整型为例:

//创建大小为8的整型数组
int arr1[8];
// []里面应放常量,因此若:
int num=8;
//则有:
arr2[num];      num为变量,创建失败
// 此时 arr1 != arr2
 

初始化就是合理赋值,有多种方式,合理即可:

//指定大小的初始化
int arr1[3]={1,2,3};
//不指定大小的初始化
int arr2[]={1,2,3};
//指定大小的不完全初始化
int arr3[3]={1,2};

这里创建字符数组时应注意这种情况:

	char arr1[] = {"abcdef"};
	char arr2[] = {'a','b','c','d','e','f'};

这两种初始化看着内容相同,但 arr1 不等同于 arr2,这里我们用 strlen函数 分别求他们的字符串长度:

arr1是我们能想到的,但是arr2却超出预料,原因是strlen遇到字符'\0' ('\0'为结束标志)结束读取,且打印出的个数里不算字符'\0'.

arr1字符串末尾f后面默认有结束标志,而arr2字符f后面无结束标志,为随机值,strlen必须读取到'\0'才会结束读取,因此读取到的为随机数。

	//改写arr2为:
char arr2[] = {'a','b','c','d','e','f','\0'};

那么结果:

2.使用下标访问

数组是用 [] 来进行下标访问的,数组下标从0开始。

如:       arr1[3]={1,2,3};

则数据的下标为:  0 1 2        一一对应

写个栗子,分别打印 int arr2[5]={1,2,3,4,5}; 的每个元素

注:int sz = sizeof(arr2) / sizeof(arr2[0]);   //通过字节计算元素个数,确定判断条件 因为已经知道了元素个数里可省略 直接令 i<5.

#include <stdio.h>
int main()
{
	int i = 0;
	int arr2[5] = { 1, 2, 3, 4, 5 };         //创建数组arr2并初始化
	int sz = sizeof(arr2) / sizeof(arr2[0]);   //通过字节计算元素个数,确定判断条件
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr2[i]);            下标从0开始,依次访问每个元素
	}
	return;
}

3.在内存中的存储

由上面的栗子我们直接打印数组每个元素的内存:

观察不难发现每个元素间相差四个字节,且地址由低到高。

得到结论:数组在内存中是连续存放的。

二,二维数组

1.创建和初始化

一般形式:

类型     数组名  [常量表达式][常量表达式]

//数组创建
int arr[3][4];   //三行四列
char arr[3][6];   //三行六列

一维是单行,这里可将二维理解为行列

初始化也与一维数组没多少差别:

//指定大小的初始化
int arr1[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//不指定大小的初始化,(行可不指定,但列不可省略,必须指定)
int arr2[][6]={1,2,3};

int arr3[][4]={{1,2},{3,4},5,6,7,8,9};   //赋值中{}里面的{}可代表一行的内容

//指定大小的不完全初始化
int arr4[3][2]={1,2,3};

不完全初始化的值为0

2.使用下标访问

二维数组的访问就很有意思   将二维数组看成行列 用坐标来访问

以  int arr1[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};   三行四列  为例:

注:列和行的下标都是从0开始

比如我们想打印6,那么应该是arr1[1][1],而不是arr1[2][2].

3.在内存中的存储

继续以arr1为例:

地址依旧是连续的,由低地址到高地址。

三,越界问题

例如:

创建一个数组  int arr1[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};  访问时行不能<0 或 >=3,列不能<0 或 >=4,否则就是数组越界。

编译代码时,越界不一定会报错,注意自己检查。

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

(0)

相关推荐

  • c语言循环加数组实现汉诺塔问题

    目录 简介 递归的汉诺塔解法(c语言) 循环实现汉诺塔问题(c语言) 简介 汉诺塔问题是学数据结构与算法的时候会遇到的问题,相信来看本文的读者应该都对汉诺塔问题有基本的了解,理论上所有的递归都可以改成循环,常规的做法是借助堆栈,但是我一想好像用循环加数组也可以实现,于是就有了本文,实现声明,本文最后出来的算法效率不高的,比直接用递归实现还要差很多,追求算法效率的同学就不用看这个了.题目:假设有3个柱子,分别为A.B.C,A柱子上有数量为n个的空心圆盘,从上到下序号分别为1...n,要求把A柱子中

  • 从头学习C语言之指针和数组

    目录 指针和数组: 示例: 总结 指针和数组: 数组名其实是数组第一个元素的地址. %p用来打印地址,为十六进制 &:取址操作符 如果用一个指针指向数组,应该怎么做呢? char *p; p=a;//语句1 p=&a[0];//语句2 指针的运算: 当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于只想距离指针所在位置向前或向后第n个元素. 对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法. 需要郑重强调的是:p+1并不是简单的将地址加1,二

  • C语言 指针数组进阶详解

    目录 指针与数组中的sizeof与strlen sizeof strlen 数组名 1.一维数组 整型数组 字符数组 指针数组 2.二维数组 指针笔试题 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽.接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧! 指针与数组中的sizeof与strlen sizeof sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作

  • 浅谈C语言数组元素下标为何从0开始

    很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个.的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从1开始的.难道是C语言故意要与众不同?要弄清楚这个问题,得先看一下计算机底层是怎样处理数组元素的.我们先编写了一个小程序,然后在visual studio中对其进行了反汇编.源程序和反汇编后的部分代码如下: 源程序: int arr[5];  //一个全局数组 int main() {    int

  • C语言教程之数组详解

    目录 1.一维数组的创建和初始化 1.1数组的创建 1.2数组的初始化 1.3一维数组的使用 1.4 一维数组在内存中的存储 2.二维数组的创建和初始化 2.1二维数组的创建 2.2二维数组的初始化 2.3二维数组的使用 2.4二维数组在内存中的存储 3. 数组越界 4. 数组作为函数参数 4.1 冒泡排序函数的错误设计 4.2 数组名是什么? 4.3 冒泡排序函数的正确设计 总结 1.一维数组的创建和初始化 1.1数组的创建 数组是一组相同类型元素的集合. 数组的创建方式: 数组的元素类型 数

  • C语言数组实现三子棋应用实例

    本文实例为大家分享了C语言数组实现三子棋应用的具体代码,供大家参考,具体内容如下 三子棋:(拆分部分如下) test.c 测试游戏逻辑 game.h关于游戏相关的函数声明,符号声明 头文件的包含 game.c游戏相关函数的实现 游戏进行的过程:(4种) 1.玩家获胜--*(游戏结束) 2.电脑获胜--#(游戏结束) 3.平局--Q(游戏结束) 4.游戏继续--C IsWin函数 用来判断游戏的状态 game.c #include"game.h" #include<stdio.h&

  • C语言数组详细介绍

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

  • C语言怎么连接两个数组的内容你知道吗

    目录 要求: 源代码如下: 运行效果图如下: 总结 要求: 定义两个数组,并用指针将两个数组的内容连接到一起 源代码如下: #include<stdio.h> void main() { char str1[100],str2[100],*p1,*p2; p1=str1; p2=str2; printf("请输入str1的内容:\n"); gets(str1); printf("请输入str2的内容:\n"); gets(str2); while(*p1

  • C语言数组和指针,内存之间的关系

    首先论证一维数组和一级指针之前的关系,我们常常使用一级指针指针的方式访问一维数组,只有对内存的理解到位才能理解它们直接的关系. 1.数组名是数组的首地址 2.对数组名取地址得到的还是数组的首地址 3.数组的访问方式其实就是首地址+偏移的寻址访问 我们在程序中会定义很多变量,有基本类型和自定义类型在进行开发的时候我对内存的访问访问就是通过变量名赋值的方式读写内存但是如果你看到的直接变量的符号名你将不可能理解内存.每一种类型都有字节宽度,char 1字节 short 2字节 int 字节float

  • C语言数组全面总结梳理

    目录 一,一维数组 1.创建和初始化 2.使用下标访问 3.在内存中的存储 二,二维数组 1.创建和初始化 2.使用下标访问 3.在内存中的存储 三,越界问题 数组(array)是由一系列类型相同的元素构成. 一般形式: 类型     数组名  [常量表达式] 一,一维数组 1.创建和初始化 创建一堆相同元素的集合,以整型为例: //创建大小为8的整型数组 int arr1[8]; // []里面应放常量,因此若: int num=8; //则有: arr2[num]; num为变量,创建失败

  • C语言数组的各种操作梳理

    目录 一.一维数组 1.创建 2.初始化 3.使用 4.数组在内存中的存储 5.数组大小的计算 二.二维数组 1.创建 2.初始化 3.使用 4.二维数组在内存中的存储 三.数组作为函数参数 1.关于数组名是数组首元素的地址的两个例外 2.冒泡排序 一.一维数组 1.创建 //如何创建数组 int num[10]; char arr[10]; double sum[10]; float fix[10]; //变长数组 //数组的大小是变量 //C99语法支持 int a = 10; int ar

  • C语言线性表全面梳理操作方法

    线性表:零个或多个数据元素的有限序列 强调几点: 首先它是一个序列.也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他都有一个前驱和后继. 其次线性表强调是有限的. 线性表有两种物理结构,第一种是顺序存储结构,另一种是链式存储结构. 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素.用c语言的一维数组来实现顺序存储结构. 线性表顺序存储结构的优缺点 优点:可以快速地读取表中任一位置的元素 无需为表示表中元素之间的逻辑关系而增加额

  • GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() {     var iarray1 [5]int32    

  • C语言 数组指针详解及示例代码

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第 0 个元素.在C语言中,我们将第 0 个元素的地址称为数组的首地址.以上面的数组为例,下图是 arr 的指向: 下面的例子演示了如何以指针的方

  • C语言数组入门之数组的声明与二维数组的模拟

    语言中指针与数组这两个概念之间的联系是密不可分的,以至于如果不能理解一个概念,就无法彻底理解另一个概念. C语言中的数组值得注意的地方有以下两点: C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来.然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组.这样,要"仿真"出一个多维数组就不是一件难事. 对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针.其他有关数组的操作,哪怕它们看上去是以数组下标进行运算的,

  • 深入理解c语言数组

    一 数组名是什么 数组就是一段连续可用的内存.比如声明一个 int数组 int array[]={1,2,3}; array代表什么?有的资料说:数组名是指向数组首地址的常量指针. 下面我们可以验证一下.我都知道sizeof操作符可以返回一个对象或者类型所占的内存字节数.如:int i=1:那么sizeof(i) 的结果就是4(64位机器下的部分编译器是8) 那我们打印sizeof(array) printf("%d\n",sizeof(array)); 结果是:12. 但是我们都知道

  • C语言 数组中重复的数字分析及方法

    C语言 数组中重复的数字解决方法: 题目:在一个长度为n的数组里的所有数字都在0-n-1的 范围内.数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 解法1:对于数组进行排序,之后对于已经排序的数组进行遍历便可知道数组中重复的数字. 时间复杂度;O(nlogn); 解法2:建立一个大小为O(N)的哈希表,遍历数组中的元素并判断是否存在于哈

  • C语言数组元素的循环移位方法

    如下所示: /*C语言数组元素的循环移位*/ #include <stdio.h> int main() { int num[5],num1[5]; int i, j,k=1; int t,n; printf("请输入5个数:"); for(i=0;i<5;i++) { scanf("%d",&num[i]); //将数读入数组num } printf("请输入循环次数:"); scanf("%d",

  • C语言数组栈实现模板

    本文实例为大家分享了C语言数组栈实现模板的具体代码,供大家参考,具体内容如下 SeqStack.h #pragma once #define MAX_SIZE 1024 typedef struct SEQSTACK { void* data[MAX_SIZE]; int size; }SeqStack; SeqStack* Init_SeqStack(); // 初始化栈 void Push_SeqStack(SeqStack* stack, void* data); // 入栈 void*

随机推荐