C语言数组全面总结梳理

 更新时间:2022年02月11日 16:44:57   作者:i跑跑  
在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活

数组(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语言 数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言数据结构之模式匹配字符串定位问题

    C语言数据结构之模式匹配字符串定位问题

    这篇文章主要介绍了C语言数据结构之模式匹配字符串定位问题的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • 深入了解C语言中的字符串和内存函数

    深入了解C语言中的字符串和内存函数

    本文主要带大家来学习一些常用的库函数。有了这些库函数,我们可以更加方便地操作字符串和内存,从而提升我们的编码效率。话不多说,我们开始吧
    2022-11-11
  • C++ 实现线程安全的频率限制器(推荐)

    C++ 实现线程安全的频率限制器(推荐)

    这篇文章主要介绍了在 C++ 中实现一个线程安全的频率限制器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 实例详解C++中指针与引用的区别

    实例详解C++中指针与引用的区别

    引用是C++引入的重要机制(C语言没有引用),它使原来在C中必须用指针来实现的功能有了另一种实现的选择,在书写形式上更为简洁,那么引用的本质是什么,它与指针又有什么关系呢?这篇文章主要给大家介绍了关于C++中指针与引用的区别,需要的朋友可以参考下
    2021-07-07
  • 从C语言过渡到C++之const

    从C语言过渡到C++之const

    C++中最早引入const是为了替代#define,后来又衍生出了其它用法。这一篇中我们来详细介绍const的各种常见用法。希望对大家学习C++有所帮助。
    2017-07-07
  • C++函数返回值为对象时,构造析构函数的执行细节

    C++函数返回值为对象时,构造析构函数的执行细节

    C++函数返回值为对象时,构造析构函数的执行细节,需要的朋友,可以参考下
    2013-02-02
  • C/C++中typedef的用法大全

    C/C++中typedef的用法大全

    typedef用法一共七种,分别是:为基本数据类型起别名、为结构体起别名、为指针类型起别名、为数组类型起别名、为枚举类型起别名、为模版函数起别名。本文就来分别讲讲这7个用法的具体实现吧
    2023-04-04
  • c语言单词搜索的实现

    c语言单词搜索的实现

    本文主要介绍了c语言单词搜索的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C/C++产生指定范围和不定范围随机数的实例代码

    C/C++产生指定范围和不定范围随机数的实例代码

    C/C++产生随机数用到两个函数rand() 和 srand(),这里介绍不指定范围产生随机数和指定范围产生随机数的方法代码大家参考使用
    2013-11-11
  • C语言实现飞机游戏(豪华版)的示例代码

    C语言实现飞机游戏(豪华版)的示例代码

    在前文中已经实现了基础版和进阶版的飞机游戏,但是存在的问题很明显:已经发射出去的子弹会随着飞机位置的实时改变而改变,并且不能实现连发。本篇文章将利用数组进一步改进空战游戏,感兴趣的可以了解一下
    2022-10-10

最新评论