产品选型

单片机c语言数组 十,c语言之数组

小编 2024-10-09 产品选型 23 0

十、c语言之数组

前一篇文章已经介绍了指针,接着介绍一下数组。

什么是数组?

数组定义:int table[3];

大家都明白这里定义了一个数组,其包含了3个int 型的数据。那么同样的问题,这组数据存储的地址该如何读取,存储的数据又该如何存取呢

同样我们假设在8bit-C51单片机的应用环境下定义一组数组int table[3];其意思就是在存储器中给6byte的空间取了个名字(变量名称)叫table,这里一定要注意,数组变量的名称只有一个,那就table,而table[0]/ table[1]/ table[2]组成变量的元素,它并不是变量的名称,简单点说,编译器只会认table以及分配给它6byte空间。

同样举个例子,我们来到某个城市去找酒店,我们肯定是按照酒店的名字去寻找,而数组的名称(table)就是整个数组酒店的名称,这个酒店肯定是按房号一间间的排布在这个酒店里的,这就像组成数据的元素名称,所以我们通常说的是某某酒店几号房间,你就能顺利找到房间里你要找的人或物了。所以这么理解来说的话,你要取某个数组元素里面的值,就得先确定数组名称(比如table),再找到元素编号(比如1),所以table[1]就是你要找的存储器里面该数组编号为2的值了。同一个城市或许酒店的名称有相同的,所以你要准确找到这个酒店的话,除了名称之外,你最好还需要有导航图,而&table就是你要找到这个酒店的准确地址了,&像不像大家导航的路线,所以&table就是这组数组的首地址了。举例只是方便大姐理解,不必过于较真。

总结来说,定义一个一维数组之后int table[3];

&table:代表这个数组的首地址

table[0]/ table[1]/ table[2]就是组成数组的三个元素的值。

那么&table[0]又是什么意思呢?

& table [0]和& table 的区别

这里& table [0]和& table到底有什么区别呢?table [0]是一个元素,table是整个数组,虽然&table [0]和&table的值一样,但两个地址指的数据类型不一样,数组的地址指向类型是整个数组,数组第一个元素的地址指向类型是第一个元素。

C语言中数组首地址和数组第一个元素的地址关系如下:

1、它们的地址值是相等的。

2、第1个元素的地址如果是p,则p+1就是第2个元素的地址。

3、数组的首地址如果是p,则p+1就跳过这个数组,而指向这个数组最后一个元素最后一个字节的下一字节。

举例说明,假设8bit-C51单片机环境下定义数组int table[3],存储空间地址0x1000~0x1006中

&table = 0x1000;

&table+1 = 0x1006;

&table[0] = 0x1000;

&table[0] +1= 0x1002;

table[0]=0x1122;

table[1] = 0x3344;

table[2] = 0x5566;

留一个问题,table值是多少,table+1又是多少,有兴趣的可以上机自己看看(个人不是很建议编程中去使用)。

数组和指针之间有关系吗?

首先说结论,原则上来说,数组和指针之间没有任何关系,这里之所以要提这个话题,是因为现实编程中很多时候看上去数组和指针之间有非常多相近的地方。

首先说指针,在应用环境确定的时候,指针可以指向存储器中某一个地址,但是指针变量在应用环境确定的时候,指针变量所占的位数就是固定的。

数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据。

虽然两者在原理上毫无关系,但是使用中却经常转换,举个例子

要求采用指针读取数组里面的值可以如下操作

int *p;

int table_buf[]; //定义一组buf,编程中一般会带初值

P = &table_buf; //将buf的首地址传递给指针

至此,table_buf里面的值,就完全可以采用指针读写的方式,一笔笔的传递给外部变量使用了。这在编程中开辟乒乓buf使用是很有帮助的。

C语言编程技巧:如何定义一个字符串的数组

实现目的

我们在用C语言编写程序时,经常会遇到使用字符串数组的情况,这种数组的特点是, 数组中的每个元素都是一个字符串,但每个字符串的长度却不相同。如果你使用C++语言进行编程的话,实现起来相对比较简单,只需直接选择标准模板库的字符串string类,在代码中定义该类的一个数组即可实现。现在的问题是,在纯C语言中如何定义这样的一个字符串数组呢?

如对于下面的一个字符串数组:

str = {

“I love C.”,

“I love C++.”,

“I love JAVA.”,

“I love Python.”,

“I love LabVIEW.”

}

下面给出C语言中的两种定义方法。

方法1:定义一个char类型的二维数组

这种方法是通过定义一个char类型的二维数组实现,通过二维数组的行索引可得到数组中的每个字符串,列的大小限定了每个字符串所能包含的最大字符个数,所以采用这种定义方式时,列的大小必须不能小于数组所有字符串的最大长度。如对于上面的数组,C语言的定义代码如下:

在取该数组的每个字符串时,直接对行索引即可。

方法2:定义一个指向char类型的指针数组

这种方法是通过定义一个指向char类型的指针数组实现,数组中的每个元素都是一个指针,通过该指针可得到数组中的每个字符串。如对于上面的数组,C语言的定义代码如下:

两种方法对比

上面的两种方法都可以实现我们的目的,但在内存的占用上两种方法不同。第1种方法定义了一个5行20列的二维数组,即每个字符串所占的字节长度都为20个,所以共需要占用100个字节,而第2种方法是定义的指针数组,每个指针指向的字符串占用的字节长度是其实际长度,所以其总的长度肯定小于100个字节。综合来讲,第1种方法相对于第2种方法,造成了存储空间的浪费情况。

完整的测试代码

下面给出这个例子的完整的C语言测试代码,如下图所示:

程序运行结果如下图所示:

总结

一般在C语言中定义字符串的数组时,推荐使用第2种方法,特别是对于单片机、嵌入式等方面的程序开发时,可以充分利用有限的硬件资源,避免存储空间的浪费。

欢迎加关注,共同交流。

相关问答

单片机C语言 里怎么定义BYTE型的 数组 ? - 156****9155 的回答 ...

你这个不是BYTE型数组啊。typedefunsignedcharBYTE;BYTEbuff[16]={0};表示将buff[0]....buff[15]都赋值为0x001、C语言中的字...

单片机c语言 如何把一个char型 数组 里的数全部快速变成0x00?

一:定义时初始化,charcArr[10]={'0x00'};二:执行时,memset(cArr,0x00,sizeof(char)*10);三:循环语句逐个赋值cArr[i...

单片机 如何清空 数组 ?

有两种方法可以实现。为方便说明,定义整型数组a,并实现将a清空。inta[4]={1,2,3,4};1、通过数组遍历,逐个赋值为0。定义循环变量inti;for(i=0;i....

32位 单片机 16位 数组 如何存储?

32位单片机可以使用两个16位的寄存器来存储一个16位数组。在存储时,可以将数组的第一个元素存储在一个寄存器中,将第二个元素存储在另一个寄存器中,以此类推。...

单片机 中在六位的晶体管的1,3,5号管中显示数字的 c 程序怎么编?

首先先宏定义数组,将数码管的供养或共阴极代码写入,具体是哪种得看数码管的型号。然后将数码管的八个数据口接到单片机的其中一组p口。利用程序读取数组的对...

52 单片机 怎么把数据存到EPROM里,有一 数组 ,更改后断电还为更改后的数据,不是原始数据。怎么保存,求解?

都没有看到你保存密码的函数,把新密码保存到数值,然后通过单片机官方的EEPRO写函数写入,上电把密码从EEPROM读出和当前按下的密码进行比对,很简单的东西啊。...

51 单片机 如何清空buf 数组 ?

在51单片机中,清空buf数组需要使用一个循环语句将每一个元素赋值为0。可以使用for循环或while循环实现,循环次数应该根据数组的长度来确定。例如,对于一个长度...

单片机C语言 的uchar dispcode[10]是什么意思?

定义了unsignedchar的名为dispcode的10个元素的一维数组,看名字应该是存的数码管显示编码。定义了unsignedchar的名为dispcode的10个元素的一维数组,看名....

51 单片机 中的基本数据类型?

在标准C语言中,存在着如下六种基本数据类型:1、char:字符型;2、short=shortint:短整型3、int:整型4、long=longint:长整型5、float:单精...

励磁方法建立励磁顺序 数组 是什么意思?

励磁方法建立励磁顺序数组是指在电力系统中,为了控制发电机的励磁过程,按照一定的顺序对发电机的励磁系统进行设置和调整。这个过程涉及到对发电机励磁电流的...

猜你喜欢