数组的理解和常用数据对应数可用的原理和应用

 2024-01-06 00:01:38  阅读 0

数组可以这么理解。 你建造(定义)了一个名为“武城楼”的工程建筑(阵)。 整栋楼有100个房间用来存储数据。 你给每个房间编号从0-99(在C语言中,写为int[100];)

提醒:学习C语言时,不要迷信书本、试题、老师、网上的回复; 迷信CPU、编译器、调试器、运行结果!

例如:

int类型占用2个字节。 这是16位计算机的时代。 如今,所有计算机都是32位和64位计算机。 因此,你无法记住课本或课件中的内容!

以我的电脑为例!运行如下代码:可以通过(char)、(char*)等获取常见数据类型对应的字节数。

#

#

int main()

(“%d\n”,(字符));

("%d\n",(int));

此时int类型占用4个字节,cahr类型占用1个字节。

一.数组的初始化

1>静态数组、动态数组初始化

int b[5] = {1, 2, 3, 4, 5};

如果静态存储的数组未初始化,则所有元素都会自动赋值为 0。

整数b[5];

如果动态存储的数组没有初始化,所有元素都将是随机值 auto int c[5]; 相当于 int c[5];

2>一些元素的初始化

int b[5] = {1, 2, 3};

b[0] = 1、b[1] = 2、b[2] = 3、b[3] = 0、b[4] = 0

自动 int fib[20] = {0, 1};

fib[0] = 0,fib[1] = 1,其余元素不确定。 如果给所有元素赋初始值,数组长度可以省略 int a[ 10 ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

二.交换数组元素

其本质是数据存储和替换的过程。

温度 = a[索引]; //将需要交换的数据之一保存在“介质”中

a[索引] = a[k]; //用另一个数据替换之前的数据

a[k] = temp;//将之前取出来放入介质中的数据保存到第二个数据中

数组有几个必须注意的特性。 当你看到数组时,你应该想到:

1、数组中的数据类型相同,组中的成员也必须相同。 俗话说,物以类聚,物以类聚,在计算机领域也是如此。

我们先看一下数据的基本类型:[int,float,,char]

这些是基本类型,因此它们可以存在于以下类型的数组中:int a[10]、float f[10]、doule d[10]、char str[10]; 每个都有 10 个元素,每个 Types 都是前面声明的类型。

2、实际上数组在内存中是连续分配的,如下图:

定义了一个int类型数组a。 它有7个元素,分别是5、2、0、1、3、1、4。它们在内存中连续存储,每个元素占用4个字节。

仔细看上图,每个字符都有一个地址,它们的跨度是4(字节)。 数组的每个元素都可以通过下标访问。 下标(比如常用index来表示它的下标)实际上就是它在数组中的位置,也就是它的编号。

拉10个人过来数,1、2、3……,但是C语言中数组的下标是从0开始的,计算机中可以访问的最小单位是字节,即只能找到地址以字节为单位,不能更精确。

数组名a和变量名原则上是一样的。 它们在编译期间绑定到数组的首地址。 a是数组的首地址。 变量名和数组名实际上都是方便人们记忆的代号。 代码反汇编后发现变量名实际上并不存在。

我们再来看一个字符数组

定义了一个字符数组a。 它有6个元素,即'W'、'X'、'H'、'W'、'X'、'H'。 它们连续存储在内存中。 每个元素占用一个字节。 强烈谴责那些把‘A’当作“A”的人,前者是单个字符,后者是字符串。

我鄙视那些问“字符和字符串有什么区别?”的人。 如果他们不知道字符和字符串的区别,你吃过羊肉串吗?

单个羊肉块“A”可以称为串吗? 多个羊肉块‘A’在一起称为字符串,因此字符是单个字符,字符串可以是多个字符的数组(末尾有终止符\0)。

需要注意的是字符和字符串的输入输出格式:

输入示例:

接下来的两个输入

while((str = ( )) != '\n')

我++;

str = '\0';

scanf("%s",str); //注意这里'&'

考虑一下这两种情况? ? ?

补充:为什么scanf函数中有些输入变量前面不需要加“&”符号?

如果学C的话,肯定会接触到两个语句,scanf和。

这两个函数是头文件stdio.h中定义的常用函数。 使用时需要添加#以保证这两个函数能够调用成功。 scanf 是一个格式输入函数。 它将键盘上的数据按照程序员指定的格式输入到指定的变量中。

scanf的用法是

1. int a;//声明(待输入)变量a为int(,)数据类型,系统将为变量a分配一个内存地址

2. scanf("%d",&a);//扫描(scanf,-scan)从键盘输入的十进制形式的数量(%d,),存入变量a的地址(&a)

[%是格式前缀,%d是有符号十进制整数,%u是无符号十进制整数,%f是浮点数,%s是字符串,%c是单个字符,%p是指针的值,%e是指数形式的浮点数,%x,%X无符号十六进制整数,

%0 是以八进制表示的无符号整数。 %g 用于输出实数。 它根据值的大小自动选择%f格式或%e格式(输出时选择宽度较小的),不输出无意义的信息。 共 0]

&是地址运算,&a是变量a的内存地址。 其实整个scanf函数的核心就是定义扫描数据的格式类型以及存放在哪里。

前面说过,scanf的目的就是将格式化的数据存储到一个地址...“&”运算的结果是一个内存地址,而我们只是将某个变量写入这个内存地址...

scanf("%s",str)中的str不需要加上“&”操作,其本质涉及到指针相关的知识。 定义str[10]为char数据类型,则str[10]是一个数组,str表示数组所在内存段的头地址。

scanf()函数所需的地址实质上是一段数据对应的内存段的起始地址。 str已经是数据所在内存段的头地址了,所以不需要“&”值。 当然,如果加上的话,就不会报错了……

关于二维数组

定义格式:数组名[行下标][列下标]

a 是一个包含 3X4=12 个字符元素的二维数组。

编译器认为它是一个一维数组,它有三个元素,分别是a[0]、a[1]、a[2]。 每个元素都是 4 个字符的数组。

从上面的分析我们可以看出数组在很多方面都是相似的。 事实上,当编译器处理数组时,它将它们视为指针。 不可能。 编译器只识别地址,并且始终使用变量名。 不被编译器接受。

二维数组的初始化

为分支分配初始值

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

int b[4][3] = {{1,2,3},{ },{4,5}};

依次赋值初始值

int a[3][3] = {1,2,3,4,5,6,7,8,9};

int b[4][3] = {1,2,3,0,0,0,4,5};

遍历二维数组

方法是使用嵌套循环通过增减下标来遍历

for(i = 0; i < n; i++)

for(j = 0; j < n; j++)

a[j]=……;

矩阵

经典数组编程

1>自定义一个函数(年、月、日),

计算并返回年月日对应的一年中的第几天。

(2000年3月1日)

返回 61

(1981,3,1)

返回 60

分析:月 0 1 2 3 …… 11 12

非闰年 0 31 28 31 30 31

闰年 0 31 29 31 30 31

功能部分代码

int(int 年、int 月、int 日)

int k,跳跃;

int 选项卡[2][13]={

{0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31}, // 注意这里的“,”

{0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31}

};

闰年 = (year%4==0&&year0!=0) || 年%400==0;

对于 (k=1;k

天 = 天 + tab[闰][k];

天;

2>输入以回车结尾的字符串(小于80个字符),统计其中数字字符的个数。

代码:

#

int 主函数(无效)

整数计数,i;

字符str[80];

(“进入一个 : ”);

我 = 0;

while((str = ( )) != '\n')

我++;

str = '\0';

计数=0;

for(i = 0; str != '\0'; i++)

if(str = '0')

计数++;

(“计数 = %d\n”, 计数);

0;

免费评级

参与人数:10个爱心币+11个热情点+9个理由

圆形瞳孔

+ 1

+ 1

认真讨论,共同提高!

CETD

+ 1

+ 1

我同意!

吴晓雅

+ 1

+ 1

认真讨论,共同提高!

+ 1

+ 1

谢谢@!

+ 1

+ 1

我同意!

朴凌若兮

+ 1

认真讨论,共同提高!

+ 1

+ 1

标签: 数组 字符 变量

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码