【C语言详解】数组的存,用,在内存中的存储模式

您所在的位置:网站首页 如下的数组中,数组array占用的内存空间 【C语言详解】数组的存,用,在内存中的存储模式

【C语言详解】数组的存,用,在内存中的存储模式

2024-07-13 20:04| 来源: 网络整理| 查看: 265

【C语言详解】数组的存,用,在内存中的存储模式 1.数组是什么?2.一维数组的创建和初始化Q:创建一维数组的语法:Q:一维数组的初始化:演示6:字符数组的初始值99,'99',"99"你分清了吗?演示8:字符串中'\0'的一二件事 3.一维数组的使用4.编写代码计算数组中的元素个数5.一维数组在内存中的存储Q:打印数组中每个元素在内存中的地址值Q:一维数组在内存中是如何存储的?Q:灵活应用一维数组在内存中的存储 6.二维数组的创建和初始化Q:创建二维数组的语法:Q:二维数组的初始化: 7.二维数组的使用8.二维数组在内存中的存储Q:打印二维数组中每个元素在内存中的地址值Q:二维数组在内存中是怎么存储的?Q:灵活应用二维数组在内存中的存储

1.数组是什么?

数组是一类相同类型数据的集合。众所周知,想要使用数据的第一步是把数据存储起来,在C语言中:数组可以存储数据。当我们想要把一类相同类型元素(比如1,2,3…)存储到计算机中时,我们就可以把它们存放到数组中,以达到把数据存储到计算机中的目的。

2.一维数组的创建和初始化 Q:创建一维数组的语法:

A:数组中元素的数据类型 数组名称[一个常量表达式,用来指定数组大小] ;

代码演示:

#define _CRT_SECURE_NO_WARNINGS #include int main() { int arr[3+5]; //类型 名称[常量表达式] //创建一个名称是arr2的数组 //用来存放5个字符 char arr2[5]; //创建一个名称是arr3的数组 //用来存放30个浮点数 float arr3[30]; return 0; } Q:一维数组的初始化:

A:

在创建数组的同时,给数组的空间中存放一些合理的初始数据。这个操作即数组的初始化。

在对数组进行初始化时,因为数组里放的不止一个数据值,所以用{}把这些初始化值括起来。

数组初始化分为完全初始化和不完全初始化。

完全初始化指:创建空间大小为 n byte的数组,同时在数组中存放x(x=n)个初始数据值。不完全初始化指:只给数组的一部分空间存放初始值。剩余的空间都默认存放初始值0。

需要特别注意的是字符数组的初始化。字符数组的初始值可以是字符,也可以是字符串。事实上,创建字符数组就是为了更好的存放字符串。

指定数组大小和数组初始化可以同时操作(即完全初始化和不完全初始化)。也可以选择其一操作:第一种情况是,指定数组大小,不初始化。此时所有数据值默认为0。第二种情况是,不指定数组的大小,但是给数组初始化。此时数组的大小会根据初始化的内容来确定。

代码演示:

#define _CRT_SECURE_NO_WARNINGS #include #include int main() { //演示3;完全初始化和不完全初始化 //创建空间大小为5byte的数组arr1,同时在arr1中存放5个初始数据值 int arr1[5] = { 0,1,2,3,4 }; //创建空间大小为5byte的数组arr2,同时在arr2中存放3个初始数据值。 //此时,另外两个初始数据值默认为0。 int arr2[5] = { 1,2,2 }; //演示4: //字符数组的初始值是字符 char ch3[5] = { '1','a','*' };: //字符数组的初始数据值是字符串。 char ch4[5] = "abc"; //演示5: //指定数组大小,同时初始化 int a[3] = {0,1,2}; int b[3] = {0}; //指定数组大小,不初始化,此时数组c中所有数据值默认为0 int c[5] ; //初始化,但不指定数组大小.此时数组d的大小为3 int d[] = {1,2,3}; //演示6: //分析数组ch5,ch6,ch7 char ch5[5] = { 'a','b',99}; char ch6[5] = { 'a','b','c'}; char ch9[5] = {'a','b','99'}; //演示8 //试分析下列代码的运行结果: char ch7[] = "abc"; char ch8[] = { 'a','b','c'}; printf("%s\n",ch7); printf("%s\n",ch8); printf("%d\n",strlen(ch7)); printf("%d\n",strlen(ch8)); //库函数strlen可以用来求字符串长度 return 0; } 演示6:字符数组的初始值99,‘99’,"99"你分清了吗?

演示6调试结果: 在这里插入图片描述 演示6调试结果分析:

在计算机看来,字符本质上就是一个整数。即每一个字符都有一个对应的数字编码。在C语言中,该数字编码就是ACSII码值。例如字符’c’的ACSII码值是99。字符’\0’的ACSII码值是0。所以在字符数组ch5,ch6中,初始值赋99就是初始值赋字符’c’,另外两个默认初始值为0即默认初始值赋字符’\0’。众所周知,单个字符在代码中用单引号’‘引起来,字符串用双引号’’ "引起来。在字符数组中,99是ACSII码值。'99’被计算机视为字符9。"99"被计算机视为字符串99。 演示8:字符串中’\0’的一二件事

演示8调试结果: 在这里插入图片描述 演示8运行结果: 在这里插入图片描述 演示8调试结果分析:

字符串"abc"有一个隐藏的结束标志,即’\0’。这里的 '\0’在数组中占据一个空间大小 ,即数组ch7中的初始化值"abc",它的真实面目是’a’‘b’‘c’‘\0’,所以数组ch7的大小是4 * 1byte。数组ch8中初始化值就是三个字符’a’,‘b’,‘c’,所以数组ch8的大小是3 * 1byte。需要注意的是:在计算字符串长度时,'\0’仍作为字符串的结束标志,但‘\0’不算入字符串长度内。ch7中,字符串长度是3。ch8中,初值化的三个字符值构成的字符串没有结束标志,所以ch8中字符串长度不确定,是一个电脑生成的随机值。

演示8运行结果分析:

数组是在栈上开辟的,栈是一个大空间。把大空间大致分为有用空间和空闲空间。我们在创建数组时,就是从栈这个大空间中申请一个空闲空间。(这里的空闲空间是一个相对的概念,有用空间代表着里面存着有用的数据,而在栈上开辟数组成功后,数组所占用的空间就从空闲空间变为有用空间了)。 当开始执行%sch7的命令,计算机按照一定顺序开始访问栈,从ch7中字符串首地址开始打印,遇见’\0’停止打印。当开始执行%s,ch8的命令,计算机按照一定顺序开始访问栈,从ch8中字符串首地址开始打印,直到在栈里遇见\0停止打印。ch8中没有‘\0’,计算机就在栈中一直访问,直到遇见’\0’。烫烫烫烫蘟bc就是栈中其他空间的数据。

微拓展:数组大小可以用变量指定吗?点击查看答案1

3.一维数组的使用 数组中的每个元素都有自己的下标,我们可以通过下标引用操作符[]找到元素的下标,从而找到元素。规定第一个元素的下标为0,后面元素的下标向后依次递增1。需要注意的是:在上文,创建一维数组的语法中,那里数组名称后的[]只是一种语法形式,不是下标引用操作符。即在创建数组时使用的[]是语法形式,在访问数组元素时使用的[]就是下标引用操作符

代码演示:

#define _CRT_SECURE_NO_WARNINGS #include int main() { //演示1 int arr[5] = { 1,2,3,4,5 }; //该数组中元素下标依次对应是 0 1 2 3 4 //演示2 int arr1[5] = {1,2,3,4,5};//在创建数组时使用的[]是语法形式 printf("%d\n", arr1[0]);//在访问数组元素时使用的[]就是下标引用操作符 //演示3 //打印数组中的某个元素 int arr2[5] = {1,2,3,4,5}; printf("%d\n", arr2[0]); //打印数组中的全部元素(借助循环) int i = 0; int arr3[5] = { 1,2,3,4,5 }; for (i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3