單片機chCx構造數(shù)據(jù)類型課件_第1頁
單片機chCx構造數(shù)據(jù)類型課件_第2頁
單片機chCx構造數(shù)據(jù)類型課件_第3頁
單片機chCx構造數(shù)據(jù)類型課件_第4頁
單片機chCx構造數(shù)據(jù)類型課件_第5頁
已閱讀5頁,還剩141頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第5章

Cx51構造數(shù)據(jù)類型

5.1數(shù)組5.2 指 針5.3 結 構5.4 聯(lián) 合5.5 枚 舉第5章Cx51構造數(shù)據(jù)類型5.1數(shù)組15.1數(shù) 組一維數(shù)組二維數(shù)組字符數(shù)組查表數(shù)組與存儲空間5.1數(shù) 組一維數(shù)組二維數(shù)組字符數(shù)組查2這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。

一個數(shù)組可以分解為多個數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構造類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為: 數(shù)值數(shù)組、 字符數(shù)組、 指針數(shù)組、 結構數(shù)組等。

這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。一3一維數(shù)組1、一維數(shù)組的定義方式數(shù)組說明的一般形式為:類型說明符存儲類型數(shù)組名[常量表達式],……;類型說明符——任一種基本數(shù)據(jù)類型或構造數(shù)據(jù)類型。數(shù)組名——用戶定義的數(shù)組標識符。常量表達式——數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。

一維數(shù)組1、一維數(shù)組的定義方式數(shù)組說明的一般形式為:類型說4例如:

intdataa[10];說明整型數(shù)組a,有10個元素。

floatxdatab[10],c[20];說明實型數(shù)組b,有10個元素,實型數(shù)組c,有20個元素。

chardatach[20];說明字符數(shù)組ch,有20個元素。對于數(shù)組類型說明應注意以下幾點:

1.數(shù)組的類型實際上是指數(shù)組元素的取值類型。對于同一個數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。

2.數(shù)組名的書寫規(guī)則應符合標識符的書寫規(guī)定。

3.數(shù)組名不能與其它變量名相同。4.方括號中常量表達式表示數(shù)組元素的個數(shù),如a[5]表示數(shù)組a有5個元素。但是其下標從0開始計算。因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。

5.不能在方括號中用變量來表示元素的個數(shù),但是可以是符號常數(shù)或常量表達式例如:

intdataa[10];說明整型數(shù)組a,有152、數(shù)組的初始化初始化賦值的一般形式為:類型說明符存儲類型數(shù)組名[常量表達式]={值,值…值};(1)可以只給部分元素賦初值。當{}中值的個數(shù)少于元素個數(shù)時,只給前面部分元素賦值。例如:inta[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而后5個元素自動賦0值。C語言對數(shù)組的初始賦值有以下幾點規(guī)定:2、數(shù)組的初始化初始化賦值的一般形式為:(1)可以只給部分6(2)只能給元素逐個賦值,不能給數(shù)組整體賦值。

例如:給十個元素全部賦1值,只能寫為:

inta[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:

inta[10]=1;(3)不給可初始化的數(shù)組賦初值,則全部元素均為0值。(4)如給全部元素賦值,則在數(shù)組說明中,可以不給出數(shù)組元素的個數(shù)。例如:inta[5]={1,2,3,4,5};可寫為:

inta[]={1,2,3,4,5};(2)只能給元素逐個賦值,不能給數(shù)組整體賦值。(3)不給可7指向結構類型數(shù)據(jù)的指針enum_Time{A1=1,B1=3,C1=7}dataeTime;在KeilCx51的頭文件absacc.指向結構類型數(shù)據(jù)的指針1、指向數(shù)組的指針變量定義、引用和賦值因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。}p;};}time_of_day;(1)枚舉表中,每一項符號代表一個整數(shù)值。unsignedlongsecs_in_year;while(*xd_ptr)在KeilCx51的頭文件absacc.因此按數(shù)組元素的類型不同,數(shù)組又可分為:*(app+i)或*(a+i)則都表示數(shù)組元素a[i],即數(shù)組a的第i個元素。#include<absacc.#include<absacc.在指針變量app未被初始化之前,它和數(shù)組a毫不相干,沒有任何關系。C語言允許用字符串的方式對數(shù)組作初始化賦值。structmsg1*p; //定義指針二維數(shù)組二維數(shù)組說明的一般形式是:

類型說明符存儲類型數(shù)組名[常量表達式1][常量表達式2]…;1、二維數(shù)組的定義方式常量表達式1——第一維下標的長度,常量表達式2——第二維下標的長度例如:

inta[3][4];說明了一個三行四列的數(shù)組,數(shù)組名為a,其下標變量的類型為整型。指向結構類型數(shù)據(jù)的指針二維數(shù)組二維數(shù)組說明的一般形式是:

82、數(shù)組的初始化

二維數(shù)組初始化也是在類型說明時給各下標變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。例如:數(shù)組a[5][3](1)按行分段賦值intdataa[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};2、數(shù)組的初始化二維數(shù)組初始化也是在類型說明時9for(i=0;i<10;i++)printf("%d",a[i]);p->stuff=stuff;int*b=p++;++p->flgif(io_status.當程序中設定了一個數(shù)組后,C編譯器就會在系統(tǒng)的存儲空間開辟一個區(qū)域用于存儲該數(shù)組的內(nèi)容。charsex;共用體經(jīng)常被用來提供同一個數(shù)據(jù)的不同的表達方式。此行代碼也在外部存儲器的code區(qū)定義一個具有3行字符數(shù)為7的字符數(shù)組。structbirthdaydata;下面以二維數(shù)組為例來說明多維數(shù)組的指針和指針變量的使用方法(運行程序,編譯)(1)枚舉表中,每一項符號代表一個整數(shù)值。voidrqsendmssage(structmsg1*m);}p;例如:

inta[3][4];while(*xd_ptr)該操作還有跟使用環(huán)境有關:2、通過指針引用數(shù)組元素(2)按行連續(xù)賦值

intdataa[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};(3)可以只對部分元素賦初值,未賦初值的元素自動取0值。例如:intdataa[3][3]={{1},{2},{3}};是對每一行的第一列元素賦值,未賦值的元素取0值。賦值后各元素的值為:100200300

intdataa[3][3]={{0,1},{0,0,2},{3}};賦值后的元素值為010002300

for(i=0;i<10;i++)printf("%d",103、數(shù)組是一種構造類型的數(shù)據(jù)。二維數(shù)組可以看作是由一維數(shù)組的嵌套而構成的。例:二維數(shù)組a[3][4],可分解為三個一維數(shù)組,其數(shù)組名分別為a[0],a[1],a[2]。3、數(shù)組是一種構造類型的數(shù)據(jù)。二維數(shù)組可以看作是由一維數(shù)組11字符數(shù)組

用來存放字符量的數(shù)組稱為字符數(shù)組。字符數(shù)組類型說明的形式與前面介紹的數(shù)值數(shù)組相同。1、字符數(shù)組的定義方式字符數(shù)組類型說明的形式與前面介紹的數(shù)值數(shù)組相同。例如:charc[10];2、字符數(shù)組的初始化charc[10]={`c`,``,`p`,`r`,o`,g`,r`,`a`,`m`};字符數(shù)組用來存放字符量的數(shù)組稱為字符數(shù)組。12例如:

charc[]={'c','','p','r','o','g','r','a','m'};可寫為:

charc[]={"Cprogram"};或去掉{}寫為:

charc[]="Cprogram";C語言允許用字符串的方式對數(shù)組作初始化賦值。

字符串總是以'\0'作為串的結束符。因此當把一個字符串存入一個數(shù)組時,也把結束符'\0'存入數(shù)組,并以此作為該字符串是否結束的標志。

用字符串方式賦值比用字符逐個賦值要多占一個字節(jié),用于存放字符串結束標志'\0'。例如:

charc[]={'c','','p',133、2維字符數(shù)組定義及初始化

此行代碼在RAM的data區(qū)定義一個具有3行字符數(shù)少于8的字符數(shù)組。每一行的最后一個字節(jié)用于存放結束符NULL。chardatastrArray[3][8]={{“happy!”,\n},{"String”,\n},{"Hello!”,\n}};chardata

strArray[3][8];3、2維字符數(shù)組定義及初始化此行代碼在RAM的d14

對于包含初始化數(shù)據(jù)的多維數(shù)組,第一個下標的具體數(shù)字也可以省略:

此行代碼也在外部存儲器的code區(qū)定義一個具有3行字符數(shù)為7的字符數(shù)組。每一行的最后一個字節(jié)用于存放結束符NULL

。charcode

strArray[][8]={"happy!","String!","Hello!”};對于包含初始化數(shù)據(jù)的多維數(shù)組,第一個下標的具體數(shù)15數(shù)組的一個非常有用的功能就是查表。查表

特別是對那些對于傳感器的非線性轉換需要進行補償?shù)膱龊?,使用查表法(如果有必要再加上線性插值法)將比采用復雜的曲線擬合所需要的數(shù)學運算要有效得多。

表格查找執(zhí)行起來速度非???,所用的代碼也要少得多,所用的表格可以事先計算好裝入特殊的ROM區(qū),或者直接放在code區(qū),進一步使用插值還可以增加表的精確度,減少表的長度。數(shù)組的一個非常有用的功能就是查表。查表特別是對那16

當程序中設定了一個數(shù)組后,C編譯器就會在系統(tǒng)的存儲空間開辟一個區(qū)域用于存儲該數(shù)組的內(nèi)容。數(shù)組與存儲空間

對于字符數(shù)組而言,數(shù)據(jù)占據(jù)了存儲器中一串連續(xù)的字節(jié)位置。對于其它數(shù)組,如整形(int)數(shù)組,將在存儲區(qū)占據(jù)一串連續(xù)的雙字節(jié)位置,由此類推。

對于多維數(shù)組來說,一個10x10x10的三維浮點數(shù)組需要大約4k的存儲空間。一般情況下數(shù)組存儲空間不能大于64k。當程序中設定了一個數(shù)組后,C編譯器就會在系統(tǒng)的存175.2指針指針的基本慨念數(shù)組指針和指向數(shù)組的指針變量指向多維數(shù)組的指針和指針變量關于KeilCx51的指針類型5.2指針指針的基本慨念數(shù)組18指針的基本慨念

指針是一個包含存儲區(qū)地址的變量,因為指針中包含了變量的地址,它可以對它所指向的變量進行尋址,就像在8051data區(qū)中進行寄存器間接尋址,和在xdata區(qū)中用DPTR進行尋址一樣。使用指針是非常方便的,因為它很容易從一個變量移到下一個變量,所以可以寫出對大量變量進行操作的通用程序。指針的基本慨念指針是一個包含存儲區(qū)地址的變量,因19

指針要定義類型說明,說明它指向何種類型的變量。下面是一些指針定義的例子:unsignedchar

*my_ptr,*anther_ptr;unsignedint

*int_ptr;float*float_ptr;time_str

*time_ptr;1、指針變量的定義類型識別符*指針變量名

假設你用關鍵字long定義一個指針C,就把指針所指的地址看成一個長整型變量的基址。這并不說明這個指針被強迫指向長整型的變量,而是說明C把該指針所指的變量看成長整型的。指針要定義類型說明,說明它指向何種類型的變量。120

指針可被賦予任何已經(jīng)定義的變量或存儲器的地址:

My_ptr=&char_val; Int_ptr=&int_array[10]; Time_str=&oldtime;2、指針變量的引用

可通過加減來移動指針,指向不同的存儲區(qū)地址;在處理數(shù)組的時候,這一點特別有用,當指針加1的時候,它加上指針所指數(shù)據(jù)類型的長度:P107指針可被賦予任何已經(jīng)定義的變量或存儲器的地址:221數(shù)組說明的一般形式為:#include<absacc.因此當把一個字符串存入一個數(shù)組時,也把結束符'\0'存入數(shù)組,并以此作為該字符串是否結束的標志。結構體變量名.請注意,它和(*p)++以及*(p++)都不相同。共用體變量中每個成員的引用方式與結構體變量完全相同,有以下三種形式:當用指針來引用結構或聯(lián)合的成員時,可用如下方法:注:相同結構體類型的變量可以相互賦值。#include<absacc.structmsg1*p;類型名結構體成員名;*(*(p+1)+3)和a[1][3]等價標示a[1][3]的值。同樣,共用體中成員變量可以參與其所屬類型允許的任何操作。常量表達式1——第一維下標的長度,KeilCx51支持“基于存儲器”的具體指針和通用(一般)指針。例如:charc[10];此行代碼在RAM的data區(qū)定義一個具有3個元素的枚舉變量eTime,它可以取值A1、B1、C1。基于存儲區(qū)指針只用一個字節(jié)idatadatabdata和} //書上(P.structmsg1*p;int(*p)[4],i,j;

指針間可像其它變量那樣互相賦值,指針所指向的數(shù)據(jù)也可通過引用指針來賦值:time_ptr=oldtime_ptr;

//兩個指針指向同一地址*int_ptr=0x4500;

//把0x4500賦給

//int_ptr所指的變量當用指針來引用結構或聯(lián)合的成員時,可用如下方法:time_ptr->days=234;*time_ptr.hour=12;數(shù)組說明的一般形式為:指針間可像其它變量那22指針既可以指向變量,也可以指向數(shù)組。數(shù)組指針和指向數(shù)組的指針變量數(shù)組的指針:數(shù)組的起始地址;指向數(shù)組的指針變量:用于存放數(shù)組起始位置的變量。1、指向數(shù)組的指針變量定義、引用和賦值首先定義一個數(shù)組和指向該類型數(shù)組的指針:int

a[10]; //定義包含10個元素的整形數(shù)組int*app; //定義整形數(shù)組的通用指針

在指針變量app未被初始化之前,它和數(shù)組a毫不相干,沒有任何關系。指針既可以指向變量,也可以指向數(shù)組。數(shù)組指針和指向數(shù)組的指針23指針變量app可以初始化并使它指向數(shù)組a:

經(jīng)過初始化后數(shù)組a的第一個元素a[0]的地址值就賦給了指針變量app,這種賦值是否改變指針變量的通用屬性要看相關的數(shù)組而定,上述賦值并不改變指針變量的通用屬性。app=a; //數(shù)組指針初始化

經(jīng)過下述指針賦值后會同時改變指針變量的通用屬性(改變?yōu)閐ata屬性):intdata

a[10]; //data區(qū)定義整形數(shù)組int*app; //定義整形數(shù)組的通用指針app=a; //指針初始化指針變量app可以初始化并使它指向數(shù)組a:經(jīng)過初24C語言規(guī)定數(shù)組名稱可以代表數(shù)組的首地址,所以下面的兩個賦值方法是等同的:app=&a[0]; //指針初始化app=a; //指針初始化也可以把指針變量的定義和賦值放在同一條語句中:intcodea[10];int*app=a;C語言規(guī)定數(shù)組名稱可以代表數(shù)組的首地址,所以下面的兩個賦值方252、通過指針引用數(shù)組元素

引用數(shù)組元素可以利用數(shù)組下標獲取a[i],也可以利用指針法獲取app[i]。與數(shù)組下標法相比,使用指針法引用數(shù)組元素一般情況下能夠使目標程序代碼效率高,占用內(nèi)存少,運行速度快。

app+i或a+i都是數(shù)組元素a[i]的地址,即它們都指向數(shù)組a的第i個元素;*(app+i)或*(a+i)則都表示數(shù)組元素a[i]

,即數(shù)組a的第i個元素。

需要特別注意:C語言規(guī)定,app+i或a+i都是指向數(shù)組a的第i個元素,而不是指向其字節(jié)流的第i個字節(jié)。2、通過指針引用數(shù)組元素引用數(shù)組元素可以利用數(shù)組26例輸出具有10個元素的整形數(shù)組的每個元素的值解1下標法:main(){

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

unsignedchar

i;

for(i=0;i<10;i++)printf("%d",a[i]);}例輸出具有10個元素的整形數(shù)組的每個元素的值解1下標27解2通過數(shù)組名計算元素地址:main(){

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

unsignedchar

i;

for(i=0;i<10;i++)printf("%d",*(a+i));}解3通過指針變量計算元素地址:main(){

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

int*p;

for(p=a;p<a+10;p++)printf("%d",*p);}解2通過數(shù)組名計算元素地址:解3通過指針變量計算28賦值后的元素值為010002300C語言允許用字符串的方式對數(shù)組作初始化賦值。for(p=a;p<a+10;p++)printf("%d",*p);結構成員說明;enumcolor{red,blue,black,pink,white,yellow};ucharlen,flg,nod,sdt,cmd,stuff;數(shù)組的類型實際上是指數(shù)組元素的取值類型。Int_ptr=&int_array[10];status_val=0x12345678;先執(zhí)行()------P指向的元素自+1,即下一個元素voidmain()當你在程序中使用指針時,你應指定指針的類型,確定它們指向哪個區(qū)域,如xdata或code區(qū),這樣你的代碼會更加緊湊,因為編譯器不必去確定指針所指向的存儲區(qū),因為你已經(jīng)進行了說明。unionstatus_type]結構體類型的嵌套定義。[例1]描述通訊錄的結構體類型。unsignedchari;必須注意,其中的A1、B1、C1不能和已經(jīng)定義的其他符號沖突。{charname[20];charaddress[100];inta[10]={1,1,1,1,1,1,1,1,1,1};

這個例子中,解1和2的方法的執(zhí)行效率相同,C編譯器就是將a[i]作為*(a+i)來處理的。而解3由于使用指針變量p,不必每次都重新計算元素地址,利用高效的自加p++完成下個元素的定位,所以效率會有所提高,由于通用指針p使用3個字節(jié),效率會打折扣。假如p使用具體指針,效率會更加突出。賦值后的元素值為0100023029作用是對指針變量p所指向的元素值即*p執(zhí)行自加運算,結果不影響指針p,但是影響p所指的第一個數(shù)組元素的值。C語言規(guī)定數(shù)組名稱可以代表數(shù)組的首地址,所以下面的兩個賦值方法是等同的:charsex;通用指針包含一個字節(jié)的類型描述字節(jié),使用時要考慮類型字節(jié),并根據(jù)類型字節(jié)的內(nèi)容進行不同的處理,所以對相關存儲器的訪問效率會降低。if(io_status.structperson2、通過指針引用數(shù)組元素通用指針和標準C指針的聲明相同。unsignedchar*my_ptr,*anther_ptr;intmonth;假如指針變量元素的個數(shù)不確定,就可以定義成指針的指針int**p。基于存儲區(qū)指針只用一個字節(jié)idatadatabdata和structpersoncharaddress[100];指針要定義類型說明,說明它指向何種類型的變量??赏ㄟ^加減來移動指針,指向不同的存儲區(qū)地址;對于data、idata和pdata段,只需要8位偏移。5枚舉p->stuff=stuff;請注意,它和(*p)++以及*(p++)都不相同。3.關于指針變量的運算對于數(shù)組a[10]和同類型指針變量p=a:

p++(或p+=1)

該操作將使指針變量p指向下一個元素,即a[1],若再執(zhí)行x=*p則將取出元素a[1]賦值給x。該操作還有跟使用環(huán)境有關:

int*b=p++;

則表示先把指針p的當前值賦給指針變量b,然后指針變量p指向下一個元素。作用是對指針變量p所指向的元素值即*p執(zhí)行自加運算,結果不影30

*p++

由于運算符++和*的優(yōu)先級別相同,而結合方向對p來說自左向右,所以該運算先執(zhí)行*p,然后再執(zhí)行p++。其作用是先得到指針變量p指向的值即*p,然后再執(zhí)行p的自加運算。假如沒有使用環(huán)境,僅僅是執(zhí)行p的自加運算,等效于p++;假如存在使用環(huán)境:intb=*p++;則相當于兩條語句:int

b=*p;p++;請注意,它和(*p)++以及*(p++)都不相同。*p++31區(qū)別:(*p)++P指向的元素的內(nèi)容自+1*(p++)先執(zhí)行()------P指向的元素自+1,即下一個元素區(qū)別:(*p)++*(p++)32

*p++與*++p不同前者在使用p后進行p的自加,而后者則是在使用p前就進行p的自加:int

a[10];int*p=a;分別執(zhí)行下列語句:int

b=*p++;int

c=*++p;

前者得到的b為a[0],而后者得到的c為a[1],p在兩種運算中最后的結果相同,都指向第二個元素a[1]

。*p++與*++p不同33

(*p)++

作用是對指針變量p所指向的元素值即*p執(zhí)行自加運算,結果不影響指針p,但是影響p所指的第一個數(shù)組元素的值。P108,4

若p指向數(shù)組元素中第i個元素:P108,5*(p--)與a[i--]等價;*(++p)與a[++i]等價;*(--p)與a[--i]等價;所有這些運算都和運算環(huán)境有關。(*p)++若p指向數(shù)組元素中第i個元素:P108,534經(jīng)過初始化后數(shù)組a的第一個元素a[0]的地址值就賦給了指針變量app,這種賦值是否改變指針變量的通用屬性要看相關的數(shù)組而定,上述賦值并不改變指針變量的通用屬性。intday;structtime_strtime;structperson}mytime;可通過加減來移動指針,指向不同的存儲區(qū)地址;一個使用結構指針的簡單例子:因此當把一個字符串存入一個數(shù)組時,也把結束符'\0'存入數(shù)組,并以此作為該字符串是否結束的標志。structpersonstruct[結構體類型名]該操作將使指針變量p指向下一個元素,即a[1],若再執(zhí)行x=*p則將取出元素a[1]賦值給x。time_str*time_ptr;structbirthday例如:一個長整型變量用來存放四個寄存器的值,如果希望對這些數(shù)據(jù)有兩種表達方法,可以在聯(lián)合中定義一個長整型變量,同時再定義一個字節(jié)數(shù)組:例如:charc[10];int*app; //定義整形數(shù)組的通用指針charaddress[100];1、基于存儲器的指針p110charsex;2、通過指針引用數(shù)組元素

下面以二維數(shù)組為例來說明多維數(shù)組的指針和指針變量的使用方法(運行程序,編譯)指向多維數(shù)組的指針和指針變量main(){

int

a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}

int(*p)[4],i,j;

p=a;

i=2;

j=2;

printf("a[%d.%d]=%d\n",i

,j,*(*(p+i)+j));} //書上(P.110)括號位置有問題運算結果:a[2,2]=21經(jīng)過初始化后數(shù)組a的第一個元素a[0]的地址值就賦給了指針變35

這里實際上出現(xiàn)了指針的指針的問題,可以:int

a[3][4]={1,3,5,7,9,11,13,15,17,17,19,21,23}int

(*p)[4]=a;

定義指針變量int

(*p)[4]的含義:p是一組指針變量(共4個元素)的第一個指針變量的地址,這里數(shù)組元素是指針變量。假如指針變量元素的個數(shù)不確定,就可以定義成指針的指針int**p。p=a指向數(shù)組a的第一個數(shù)組元素的地址后(這里數(shù)組名a可以看做a[][4]數(shù)組的首地址p109):p+1和a+1等價指向數(shù)組a的第1行首元素地址;p+2和a+2等價指向數(shù)組a的第2行首元素地址;

:*(p+1)+3和&a[1][3]等價指向a[1][3]的地址;*(*(p+1)+3)和a[1][3]等價標示a[1][3]的值。這里實際上出現(xiàn)了指針的指針的問題,可以:int36習題p.1231、2、9、10習題p.1231、2、9、1037KeilCx51支持“基于存儲器”的具體指針和通用(一般)指針。關于KeilCx51的指針類型1、基于存儲器的指針p110

基于存儲器的指針就是在指針的聲明中包含一個存儲類型標識符,指向一個確定的存儲區(qū),這種指針叫具體指針。例如:chardata*str; /*ptrtostringindata*/intxdata*numtab; /*ptrtoint(s)inxdata*/longcode*powtab; /*ptrtolong(s)incode*/KeilCx51支持“基于存儲器”的具體指針和通用(一般)38

基于存儲區(qū)指針只用一個字節(jié)idatadatabdata和pdata指針或兩字節(jié)code和xdata指針?;诖鎯^(qū)指針保存存儲區(qū)的指定。在指針聲明前加一個存儲類型標識符。例如:chardata*xdatastr; /*ptrinxdatatodatachar*/intxdata*datanumtab; /*ptrindatatoxdataint*/longcode*idatapowtab; /*ptrinidatatocodelong*/基于存儲區(qū)指針只用一個字節(jié)idata392、通用(一般)指針Cx51提供一個3字節(jié)的通用存儲器指針,通用指針的頭一個字節(jié)表明指針所指的存儲區(qū)空間,另外兩個字節(jié)存儲16位偏移量。對于data、idata和pdata段,只需要8位偏移。P111-112通用指針和標準C指針的聲明相同。例如:char*s; /*stringptr*/int*numptr; /*intptr*/通用指針可訪問8051存儲空間內(nèi)的任何變量。2、通用(一般)指針Cx51提供一個3字節(jié)的通40

基于存儲器的指針其類型由C代碼中相關的存儲器類型決定,并在編譯時確定,用這種指針可以非常高效地訪問相關的存儲器。

通用指針包含一個字節(jié)的類型描述字節(jié),使用時要考慮類型字節(jié),并根據(jù)類型字節(jié)的內(nèi)容進行不同的處理,所以對相關存儲器的訪問效率會降低?;诖鎯ζ鞯闹羔樒漕愋陀蒀代碼中相關的存儲器類型41指針類型描述大小通用指針3字節(jié)xdata指針2字節(jié)code指針2字節(jié)idata指針1字節(jié)data指針1字節(jié)pdata指針1字節(jié)各種類型指針變量的字節(jié)數(shù)如下表所示:指針類型描述大小通用指針3字節(jié)xdata指針2字節(jié)code指42地址偏移+0+1+2內(nèi)容存儲器類型偏移量高位偏移量低位通用指針3個字節(jié)的含義:第一個字節(jié)表明具體存儲器的類型:類型idata/data/bdataxdatapdatacode值0x000x010xFE0xFF地址偏移+0+1+2內(nèi)容0x010x120x34

其它類型值可能會導致不可預測的程序動作,具體類型值還和編譯器的版本有關。以xdata類型的0x1234地址為指針可以表示如下:地址偏移+0+1+2內(nèi)容存儲器類型偏移量高位偏移量低位通用指43

在KeilCx51的頭文件absacc.h,使用這個頭文件,可利用三字節(jié)通用指針作為抽象指針,為個存儲器空間提供絕對地址存取技術。

對于具體指針的定義,可以使用下面任何一種方式:char

data

*xd_ptr;data

char

*xd_ptr;

其中第一種方式比較標準。在KeilCx51的頭文件absacc.h,使44pdata指針或兩字節(jié)code和xdata指針。} //書上(P.一個使用結構指針的簡單例子:(1)枚舉表中,每一項符號代表一個整數(shù)值。structbirthdaydata;對于包含初始化數(shù)據(jù)的多維數(shù)組,第一個下標的具體數(shù)字也可以省略:其中第一種方式比較標準。uniontime_typeintmonth;charaddress[100];每一行的最后一個字節(jié)用于存放結束符NULL。共用體中的成員可以是簡單變量,也可以是數(shù)組、指針、結構體和共用體。unsignedintdays;};structbirthdaydata;structpersonp;unsignedchar*my_ptr,*anther_ptr;structpersonp1,p2;time_ptr=oldtime_ptr; //兩個指針指向同一地址int*numptr; /*intptr*/#include<absacc.h>char*generic_ptr,mystring[]="Testoutput";chardata*xd_ptr;

下面的例子反映出使用具體指針比使用通用指針更加高效,使用通用指針的第一個循環(huán)需要378個處理周期,使用具體指針只需要151個處理周期:voidmain(){generic_ptr=mystring;while(*generic_ptr){XBYTE[0x0000]=*generic_ptr;generic_ptr++;}xd_ptr=mystring;while(*xd_ptr){XBYTE[0x0000]=*xd_ptr;xd_ptr++;}}pdata指針或兩字節(jié)code和xdata指針。#in45

由于使用具體指針能夠節(jié)省不少時間,所以我們一般都不使用通用指針。

當你在程序中使用指針時,你應指定指針的類型,確定它們指向哪個區(qū)域,如xdata或code區(qū),這樣你的代碼會更加緊湊,因為編譯器不必去確定指針所指向的存儲區(qū),因為你已經(jīng)進行了說明。由于使用具體指針能夠節(jié)省不少時間,所以我們一般都465.3結構結構的定義和引用結構數(shù)組指向結構類型數(shù)據(jù)的指針5.3結構結構的定義和引用結構數(shù)組47結構的定義和引用

結構是一種定義類型,它允許程序員把一系列變量集中到一個單元中,當某些變量相關的時候,使用這種類型是很方便的。例如,用一系列變量來描述一天的時間。定義時、分、秒三個變量:unsighedchar

hour,min,sec;定義一個天的變量:unsighedint

days;結構的定義和引用結構是一種定義類型,它允許程序員48通過使用結構可以把這四個變量定義在一起,給他們一個共同的名字。聲明結構的語法如下:struct

time_str{

unsignedchar

hour,min,sec;

unsignedint

days;}time_of_day;這告訴編譯器定義一個類型名為time_str的結構,并定義一個名為time_of_day的結構變量。通過使用結構可以把這四個變量定義在一起,給他們一個共同的名字491、結構體類型定義struct[結構體類型名]{

類型名結構體成員名;/*成員表*/ ……};[例1]描述通訊錄的結構體類型。structperson{charname[20];intage;charsex;charaddress[100];longzipcode;};[例2.]結構體類型的嵌套定義。structbirthday{intyear;intmonth;intday;};structperson{charname[20];structbirthdaydate;charsex;charaddress[100];longzipcode;};

1、結構體類型定義struct[結構體類型名][例1]502、定義結構類型變量(1)間接定義-先定義結構類型,后定義類型變量。

struct結構體類型名

{

成員表;

};

struct結構體類型名變量名表;2、定義結構類型變量(1)間接定義-先定義結構類型,后定義類51

structbirthday{intyear;intmonth;intday;};

structperson{charname[20];structbirthdaydate;charsex;charaddress[100];longzipcode;};

structpersonp;structbirthday52(2)在定義結構類型的同時定義該類型的變量。struct結構體類型名{

成員表;}結構體變量名表;structbirthday{intyear;intmonth;intday;};structperson{charname[20];structbirthdaydata;charsex;charaddress[100];longzipcode;}p;

(2)在定義結構類型的同時定義該類型的變量。struct53(3)直接定義結構變量,沒有結構名。struct{

成員表;}結構體變量名表;structbirthday{intyear;intmonth;intday;};struct{charname[20];structbirthdaydata;charsex;charaddress[100];longzipcode;}p;

(3)直接定義結構變量,沒有結構名。struct543、結構類型變量的引用

結構體一般不能作為一個整體參加數(shù)據(jù)處理,而參加各種運算和操作的是結構體的各個成員項數(shù)據(jù)。對成員的使用方式:

結構體變量名.成員名注:相同結構體類型的變量可以相互賦值。structpersonp1,p2;p1=p2;3、結構類型變量的引用結構體一般不能作為一個整體55p->cmd=0;enum枚舉名變量列表;uniontime_typecharaddress[100];一個使用結構指針的簡單例子:數(shù)組名不能與其它變量名相同。p->nod=0;在指針聲明前加一個存儲類型標識符。需要特別注意:C語言規(guī)定,app+i或a+i都是指向數(shù)組a的第i個元素,而不是指向其字節(jié)流的第i個字節(jié)。關于KeilCx51的指針類型{charname[20];指針變量app可以初始化并使它指向數(shù)組a:共用體變量的定義和結構體變量相似,可以先說明共用體類型,再定義變量,也可以在類型說明的同時定義變量。例如:一個長整型變量用來存放四個寄存器的值,如果希望對這些數(shù)據(jù)有兩種表達方法,可以在聯(lián)合中定義一個長整型變量,同時再定義一個字節(jié)數(shù)組:例如:charc[10];類型名結構體成員名;charcodestrArray[][8]=KeilCx51支持“基于存儲器”的具體指針和通用(一般)指針。

在KeilC和大多數(shù)C編譯器中,結構被提供了連續(xù)的存儲空間,尋址空間內(nèi)的變量順序和定義時的變量順序一樣:OffsetMemberBytes0hour11min12sec13days24、結構體變量的存儲結構p->cmd=0;在KeilC和大多數(shù)C編譯器56

若數(shù)組中每個元素變量都具有相同的結構類型,就構成一個結構數(shù)組。結構數(shù)組

結構數(shù)組與變量數(shù)組的不同之處,就在于結構數(shù)組的每一個元素都是一個由若干個變量組成的結構。

結構數(shù)組的定義方法與變量數(shù)組的定義方法相似,只要把結構變量改稱結構數(shù)組即可:structtime_stroldtime[10];若數(shù)組中每個元素變量都具有相同的結構類型,就構成57

指向結構變量的指針變量的定義和一般變量指針的定義相似。指向結構類型數(shù)據(jù)的指針

一個指向結構類型數(shù)據(jù)的指針,就是該數(shù)據(jù)在內(nèi)存中的首地址。1、指向結構變量的指針變量Struct結構類型名*指針變量名;Struct{

結構成員說明;

}*指針變量名;指向結構變量的指針變量的定義和一般變量指針的定義58#define

uint

unsignedint#define

uchar

unsignedcharstruct{

uint

lnk;

ucharlen,flg,nod,sdt,cmd,stuff;}msg1;structmsg1

*p; //定義指針voidrqsendmssage(structmsg1*m);一個使用結構指針的簡單例子:#defineuintunsignedint一個使用結59unsignedlongstatus_val;也可以把指針變量的定義和賦值放在同一條語句中:2、通過指針引用數(shù)組元素數(shù)組說明的一般形式為:(2)只能給元素逐個賦值,不能給數(shù)組整體賦值。voidmain()1、二維數(shù)組的定義方式#defineuintunsignedintinta[10]={1,2,3,4,5,6,7,8,9,10};此行代碼在RAM的data區(qū)定義一個具有3行字符數(shù)少于8的字符數(shù)組。字符串總是以'\0'作為串的結束符。p->len=8;常量表達式1——第一維下標的長度,{intyear;inta[10]={1,2,3,4,5,6,7,8,9,10};int*b=p++;flg是完全等價的。特別是對那些對于傳感器的非線性轉換需要進行補償?shù)膱龊?,使用查表法(如果有必要再加上線性插值法)將比采用復雜的曲線擬合所需要的數(shù)學運算要有效得多。enumcolorc;/*定義了枚舉變量c*/*(app+i)或*(a+i)則都表示數(shù)組元素a[i],即數(shù)組a的第i個元素。當你在程序中使用指針時,你應指定指針的類型,確定它們指向哪個區(qū)域,如xdata或code區(qū),這樣你的代碼會更加緊湊,因為編譯器不必去確定指針所指向的存儲區(qū),因為你已經(jīng)進行了說明。voidmain(){

ucharstuff=0;

structmsg1*

p;

p->len=8;p->flg=0;p->nod=0;p->cmd=0;p->stuff=stuff;rqsendmssage(p);

}unsignedlongstatus_val;void60

結構類型指針的運算規(guī)律也和一般變量指針的運算規(guī)律相似,區(qū)別僅在于指針每次增加的單元是整個結構空間。2、指向結構數(shù)組的指針變量Struct結構數(shù)組名*指針變量名;Struct{

結構成員說明;

}結構數(shù)組指針變量名[];指向結構數(shù)組的指針變量的定義結構類型指針的運算規(guī)律也和一般變量指針的運算規(guī)律61#defineuintunsignedint#defineucharunsignedcharstruct{uintlnk;ucharlen,flg,nod,sdt,cmd,stuff;}msg1[4];structmsg1*p; voidrqsendmssage(structmsg1*m);#defineuintunsignedint62#defineuintunsignedint對于字符數(shù)組而言,數(shù)據(jù)占據(jù)了存儲器中一串連續(xù)的字節(jié)位置。char*s; /*stringptr*/經(jīng)過初始化后數(shù)組a的第一個元素a[0]的地址值就賦給了指針變量app,這種賦值是否改變指針變量的通用屬性要看相關的數(shù)組而定,上述賦值并不改變指針變量的通用屬性。該操作還有跟使用環(huán)境有關:例如:

charc[]={'c','','p','r','o','g','r','a','m'};可寫為:

charc[]={"Cprogram"};或去掉{}寫為:

charc[]="Cprogram";當用指針來引用結構或聯(lián)合的成員時,可用如下方法:if(io_status.voidrqsendmssage(structmsg1*m);{charname[20];注:相同結構體類型的變量可以相互賦值。inta[10]={1,1,1,1,1,1,1,1,1,1};charsex;} //書上(P.結構是一種定義類型,它允許程序員把一系列變量集中到一個單元中,當某些變量相關的時候,使用這種類型是很方便的。1、二維數(shù)組的定義方式是對每一行的第一列元素賦值,未賦值的元素取0值。{charname[20];因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。KeilCx51支持“基于存儲器”的具體指針和通用(一般)指針。{charname[20];voidmain(){ucharstuff=0;structmsg1*p;for(p=msg1;p<msg1+4;p++){p->len=8;p->flg=0;p->nod=0;p->cmd=0;p->stuff=stuff;rqsendmssage(p);}}#defineuintunsignedintvoid633、指向結構數(shù)組的指針變量P的幾點說明如果指針指向結構數(shù)組msg1的首地址。p119(*p).flg與p->flg和msg1[0].flg是完全等價的。p+1使指針p指向結構數(shù)組msg1[0]的下一個元素msg1[1]的首地址。前++,后++運算,與指向運算符->。

(++p)->flg(p++)->flgp->flg++++p->flg3、指向結構數(shù)組的指針變量P的幾點說明如果指針指向結構數(shù)組m645.4共用體(聯(lián)合)概念:共用體是若干變量共用同一段內(nèi)存單元的構造數(shù)據(jù)類型。1、共用體類型的定義union共用體類型標識符

{

類型說明符變量名;

}其中union是關鍵字;共用體中的成員可以是簡單變量,也可以是數(shù)組、指針、結構體和共用體。5.4共用體(聯(lián)合)概念:1、共用體類型的定義un652、共用體變量的定義

共用體變量的定義和結構體變量相似,可以先說明共用體類型,再定義變量,也可以在類型說明的同時定義變量。uniontime_type{ unsignedlongsecs_in_year;

structtime_strtime;}mytime;2、共用體變量的定義共用體變量的定義和結構體變量663、共用體變量的引用

共用體變量中每個成員的引用方式與結構體變量完全相同,有以下三種形式:(1)共用體變量名.成員名(2)(*指針變量名).成員名(3)指針變量名->成員名同樣,共用體中成員變量可以參與其所屬類型允許的任何操作。

3、共用體變量的引用共用體變量中每個成員的引67

像結構一樣,聯(lián)合也以連續(xù)的空間存儲,空間大小等于聯(lián)合中最大的成員所需的空間。OffsetMemberBytes0Secs_in_year40Mytime54、共用體變量的存儲結構uniontime_type{ unsignedlongsecs_in_year; structtime_strtime;}mytime;像結構一樣,聯(lián)合也以連續(xù)的空間存儲,空間大小等于68共用體經(jīng)常被用來提供同一個數(shù)據(jù)的不同的表達方式。5、共用體的應用unionstatus_type{unsignedcharstatus[4];unsignedlongstatus_val;}io_status;io_status.status_val=0x12345678;if(io_status.status[2]&0x10){…}例如:一個長整型變量用來存放四個寄存器的值,如果希望對這些數(shù)據(jù)有兩種表達方法,可以在聯(lián)合中定義一個長整型變量,同時再定義一個字節(jié)數(shù)組:共用體經(jīng)常被用來提供同一個數(shù)據(jù)的不同的表達方式。5、共用體的695.5

枚舉

如果一個變量只有若干種可能的取值,可以將變量的所有取值一一列出,聲明一個枚舉類型,再將該變量定義為此枚舉類型,則該變量的值就只能限于此枚舉類型所列舉出來的值的范圍內(nèi)。1、枚舉類型和枚舉類型變量的定義enum枚舉名

{枚舉表}變量列表;enum枚舉名

{枚舉表};enum枚舉名

變量列表;5.5枚舉如果一個變量只有若70例:enumcolor{red,blue,black,pink,white,yellow};

/*聲明枚舉類型enumcolor*/enumcolorc;

/*定義了枚舉變量c*/

枚舉表是由若干用戶定義的標識符(如red、blue)組成,這些符號通常稱為枚舉元素。例:enum_Time{A1=1,B1=3,C1=7}dataeTime;

此行代碼在RAM的data區(qū)定義一個具有3個元素的枚舉變量eTime,它可以取值A1、B1、C1。必須注意,其中的A1、B1、C1不能和已經(jīng)定義的其他符號沖突。例:枚舉表是由若干用戶定義的標識符(如red712、枚舉變量的取值(1)枚舉表中,每一項符號代表一個整數(shù)值。在默認的情況下,第一項取值為0,第二項取值為1,第三項取值為2,…依次類推。例:enum_Time{A1,B1,C1,}dataeTime;

各符號元素去默認值A1=0、B1=1、C1=2。(2)也可以通過初始化,指定某些項的符號值。例:enum_Time{A1,B1=10,C1}dataeTime;

各符號元素取值A1=0、B1=10、C1=11。各符號元素在沒有給定具體整數(shù)值時取默認值,默認值總是比上一個元素大1,第一個元素的默認值總是0。2、枚舉變量的取值(1)枚舉表中,每一項符號代表一個整72習題p.1234、12、14習題p.1234、12、1473第5章

Cx51構造數(shù)據(jù)類型

5.1數(shù)組5.2 指 針5.3 結 構5.4 聯(lián) 合5.5 枚 舉第5章Cx51構造數(shù)據(jù)類型5.1數(shù)組745.1數(shù) 組一維數(shù)組二維數(shù)組字符數(shù)組查表數(shù)組與存儲空間5.1數(shù) 組一維數(shù)組二維數(shù)組字符數(shù)組查75這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。

一個數(shù)組可以分解為多個數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構造類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為: 數(shù)值數(shù)組、 字符數(shù)組、 指針數(shù)組、 結構數(shù)組等。

這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。一76一維數(shù)組1、一維數(shù)組的定義方式數(shù)組說明的一般形式為:類型說明符存儲類型數(shù)組名[常量表達式],……;類型說明符——任一種基本數(shù)據(jù)類型或構造數(shù)據(jù)類型。數(shù)組名——用戶定義的數(shù)組標識符。常量表達式——數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。

一維數(shù)組1、一維數(shù)組的定義方式數(shù)組說明的一般形式為:類型說77例如:

intdataa[10];說明整型數(shù)組a,有10個元素。

floatxdatab[10],c[20];說明實型數(shù)組b,有10個元素,實型數(shù)組c,有20個元素。

chardatach[20];說明字符數(shù)組ch,有20個元素。對于數(shù)組類型說明應注意以下幾點:

1.數(shù)組的類型實際上是指數(shù)組元素的取值類型。對于同一個數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。

2.數(shù)組名的書寫規(guī)則應符合標識符的書寫規(guī)定。

3.數(shù)組名不能與其它變量名相同。4.方括號中常量表達式表示數(shù)組元素的個數(shù),如a[5]表示數(shù)組a有5個元素。但是其下標從0開始計算。因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。

5.不能在方括號中用變量來表示元素的個數(shù),但是可以是符號常數(shù)或常量表達式例如:

intdataa[10];說明整型數(shù)組a,有1782、數(shù)組的初始化初始化賦值的一般形式為:類型說明符存儲類型數(shù)組名[常量表達式]={值,值…值};(1)可以只給部分元素賦初值。當{}中值的個數(shù)少于元素個數(shù)時,只給前面部分元素賦值。例如:inta[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而后5個元素自動賦0值。C語言對數(shù)組的初始賦值有以下幾點規(guī)定:2、數(shù)組的初始化初始化賦值的一般形式為:(1)可以只給部分79(2)只能給元素逐個賦值,不能給數(shù)組整體賦值。

例如:給十個元素全部賦1值,只能寫為:

inta[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:

inta[10]=1;(3)不給可初始化的數(shù)組賦初值,則全部元素均為0值。(4)如給全部元素賦值,則在數(shù)組說明中,可以不給出數(shù)組元素的個數(shù)。例如:inta[5]={1,2,3,4,5};可寫為:

inta[]={1,2,3,4,5};(2)只能給元素逐個賦值,不能給數(shù)組整體賦值。(3)不給可80指向結構類型數(shù)據(jù)的指針enum_Time{A1=1,B1=3,C1=7}dataeTime;在KeilCx51的頭文件absacc.指向結構類型數(shù)據(jù)的指針1、指向數(shù)組的指針變量定義、引用和賦值因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。}p;};}time_of_day;(1)枚舉表中,每一項符號代表一個整數(shù)值。unsignedlongsecs_in_year;while(*xd_ptr)在KeilCx51的頭文件absacc.因此按數(shù)組元素的類型不同,數(shù)組又可分為:*(app+i)或*(a+i)則都表示數(shù)組元素a[i],即數(shù)組a的第i個元素。#include<absacc.#include<absacc.在指針變量app未被初始化之前,它和數(shù)組a毫不相干,沒有任何關系。C語言允許用字符串的方式對數(shù)組作初始化賦值。structmsg1*p; //定義指針二維數(shù)組二維數(shù)組說明的一般形式是:

類型說明符存儲類型數(shù)組名[常量表達式1][常量表達式2]…;1、二維數(shù)組的定義方式常量表達式1——第一維下標的長度,常量表達式2——第二維下標的長度例如:

inta[3][4];說明了一個三行四列的數(shù)組,數(shù)組名為a,其下標變量的類型為整型。指向結構類型數(shù)據(jù)的指針二維數(shù)組二維數(shù)組說明的一般形式是:

812、數(shù)組的初始化

二維數(shù)組初始化也是在類型說明時給各下標變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。例如:數(shù)組a[5][3](1)按行分段賦值intdataa[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};2、數(shù)組的初始化二維數(shù)組初始化也是在類型說明時82for(i=0;i<10;i++)printf("%d",a[i]);p->stuff=stuff;int*b=p++;++p->flgif(io_status.當程序中設定了一個數(shù)組后,C編譯器就會在系統(tǒng)的存儲空間開辟一個區(qū)域用于存儲該數(shù)組的內(nèi)容。charsex;共用體經(jīng)常被用來提供同一個數(shù)據(jù)的不同的表達方式。此行代碼也在外部存儲器的code區(qū)定義一個具有3行字符數(shù)為7的字符數(shù)組。structbirthdaydata;下面以二維數(shù)組為例來說明多維數(shù)組的指針和指針變量的使用方法(運行程序,編譯)(1)枚舉表中,每一項符號代表一個整數(shù)值。voidrqsendmssage(structmsg1*m);}p;例如:

inta[3][4];while(*xd_ptr)該操作還有跟使用環(huán)境有關:2、通過指針引用數(shù)組元素(2)按行連續(xù)賦值

intdataa[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};(3)可以只對部分元素賦初值,未賦初值的元素自動取0值。例如:intdataa[3][3]={{1},{2},{3}};是對每一行的第一列元素賦值,未賦值的元素取0值。賦值后各元素的值為:100200300

intdataa[3][3]={{0,1},{0,0,2},{3}};賦值后的元素值為010002300

for(i=0;i<10;i++)printf("%d",833、數(shù)組是一種構造類型的數(shù)據(jù)。二維數(shù)組可以看作是由一維數(shù)組的嵌套而構成的。例:二維數(shù)組a[3][4],可分解為三個一維數(shù)組,其數(shù)組名分別為a[0],a[1],a[2]。3、數(shù)組是一種構造類型的數(shù)據(jù)。二維數(shù)組可以看作是由一維數(shù)組84字符數(shù)組

用來存放字符量的數(shù)組稱為字符數(shù)組。字符數(shù)組類型說明的形式與前面介紹的數(shù)值數(shù)組相同。1、字符數(shù)組的定義方式字符數(shù)組類型說明的形式與前面介紹的數(shù)值數(shù)組相同。例如:charc[10];2、字符數(shù)組的初始化charc[10]={`c`,``,`p`,`r`,o`,g`,r`,`a`,`m`};字符數(shù)組用來存放字符量的數(shù)組稱為字符數(shù)組。85例如:

charc[]={'c','','p','r','o','g','r','a','m'};可寫為:

charc[]={"Cprogram"};或去掉{}寫為:

charc[]="Cprogram";C語言允許用字符串的方式對數(shù)組作初始化賦值。

字符串總是以'\0'作為串的結束符。因此當把一個字符串存入一個數(shù)組時,也把結束符'\0'存入數(shù)組,并以此作為該字符串是否結束的標志。

用字符串方式賦值比用字符逐個賦值要多占一個字節(jié),用于存放字符串結束標志'\0'。例如:

charc[]={'c','','p',863、2維字符數(shù)組定義及初始化

此行代碼在RAM的data區(qū)定義一個具有3行字符數(shù)少于8的字符數(shù)組。每一行的最后一個字節(jié)用于存放結束符NUL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論