<xmp id="esg86">
<nav id="esg86"><code id="esg86"></code></nav>
<menu id="esg86"></menu>
  • <xmp id="esg86">
    <nav id="esg86"><code id="esg86"></code></nav>
  • <xmp id="esg86"><menu id="esg86"></menu>
    承接百度快照優化,SEO優化,網站關鍵詞排名,網絡推廣服務,不上首頁不收費。(灰色勿擾,詳情QQ咨詢)
    當前位置: 東莞SEO > 建站知識 > 心情隨筆 >
    聯系我們
    電話咨詢
    E-mail:77681277@qq.com

    什么是c語言程序設計(新手必看)

    作者/整理:杜克網絡 來源:互聯網 2019-06-16

    ad

    標識符和關鍵字

    (一)標識符

    標識符是用來表示源程序中自定義對象名稱的符號。其中的自定義對象可以是常量、變量、數組、結構、語句標號以及函數等。

    在C51語言中,標識符可以由字母(a~z,A~Z)、數字(0~9)和下劃線“_”組成,最多可支持32個字符。

    C51標識符的定義不是隨意的,應遵循“簡潔”和“見名知意”的原則,并需要符合一定的規則:

    ➢ 標識符的第一個字符必須是字母或者下劃線,不能為數字。由于有些編譯系統專用的標識符以下劃線開頭,所以用戶在定義標識符時一般不要以下劃線開頭。

    ➢ C51的標識符區分大小寫,例如“ch1”和“Ch1”表示兩個不同的標識符。

    ➢ 用戶自定義的標識符不能與系統保留的關鍵字重復。

    (二)關鍵字

    關鍵字是C51編譯器保留的一些特殊標識符,具有特定的含義和用法。單片機C51程序語言繼承了ANSI C標準定義的32個關鍵字,如表3-1所示。

    單片機C語言程序設計基礎知識全解析

    表3-1 C51的關鍵字

    同時C51又結合單片機硬件的特點擴展了19個關鍵字:

    _at_ idata sfr16 alien interrupt small bdata large _task_ code bit pdata using reentrant xdata compact sbit data sfr

    C51數據類型

    表3-2列出了Keil uVision2 C51編譯器所支持的數據類型。

    單片機C語言程序設計基礎知識全解析

    表3-2 C51編譯器所支持的數據類型

    1. char字符類型

    char類型的長度是一個字節,通常用于定義處理字符數據的變量或常量。char字符類型分為無符號字符類型(unsigned char)和有符號字符類型(signed char),默認值為signed char類型。

    unsigned char類型用字節中所有的位來表示數值,可以表達的數值范圍是0~255;signed char類型中字節最高位表示數據的符號,“0”表示正數,“1”表示負數(負數用補碼表示),所能表示的數值范圍是-128~+127。

    提示

    unsigned char常用于處理ASCII字符或小于等于255的整型數。

    正數的補碼與原碼相同,負二進制數的補碼等于它的絕對值按位取反后加1。

    2. int整型

    int整型長度為兩個字節,用于存放一個雙字節數據。分為有符號整型數signed int和無符號整型數unsigned int,默認值為signed int類型。

    signed int表示的數值范圍是-32768~+32767,字節中最高位表示數據的符號,“0”表示正數,“1”表示負數;unsigned int表示的數值范圍是0~65535。

    3. long長整型

    long長整型長度為四個字節,用于存放一個四字節數據。分有符號長整型signed long和無符號長整型unsigned long,默認值為signed long類型。

    signed int表示的數值范圍是-2147483648~+2147483647,字節中最高位表示數據的符號,“0”表示正數,“1”表示負數;unsigned long表示的數值范圍是0~4294967295。

    4. float浮點型

    float浮點型在十進制中具有7位有效數字,是符合IEEE-754標準的單精度浮點型數據,占用四個字節。浮點數的結構較復雜,單片機使用較少,這里不做詳細討論。

    5. *指針型

    指針型數據本身是一個變量,在這個變量中存放著指向另一個數據的地址。根據處理器的不同,指針型數據所占的內存單元也不盡相同,在C51中它的長度一般為1~3個字節。

    6. bit位標量

    bit 位標量是C51編譯器的一種擴充數據類型,利用它可定義一個位標量,但不能定義位指針,也不能定義位數組。它的值是一個二進制位,非0即1。

    定義格式:bit 變量名=變量值。

    7. sfr特殊功能寄存器

    sfr是一種擴充數據類型,占用一個內存單元,地址范圍為0x80~0xFF。

    定義格式為:sfr 變量名=變量地址。

    利用它可以訪問51單片機內部的所有特殊功能寄存器。例如,用“sfr P1=0x90”這一句定P1為P1端口在片內的寄存器。

    8. sfr16 16位特殊功能寄存器

    sfr16是一種擴充數據類型,占用兩個內存單元,sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是,此類型的變量可訪問16為特殊功能寄存器。

    定義格式:sfr16 變量名=變量地址。

    此處的變量地址為16位中的低8位地址,其地址范圍為0x80~0xFF。通過sfr16變量讀16位特殊功能寄存器時,先讀低字節,后讀高字節;寫特殊功能寄存器時先寫高字節,后寫低字節。

    9. sbit可位尋址位

    sbit是C51中的一種擴充數據類型,利用它可以訪問芯片內部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。

    定義格式:

    sbit 變量名=位地址;sbit 變量名=SFR地址^位序號;sbit 變量名=sfr16變量^位序號。

    因P1端口的寄存器是可位尋址的,所以我們可以定義P1_1為P1中的P1.1引腳,同樣我們可以用P1.1的地址去寫,這樣在以后的程序語句中就可以用P1_1來對P1.1引腳進行讀寫操作了。

    例如:

    sbit P1_1=P1^1;

    sbit P1_1=0x91

    常量與變量

    (一)常量

    常量是在程序運行過程中不能改變的量,如固定的數據表、字符等。常量的數據類型只有整型、浮點型、字符型、字符串型和位標量。

    1. 整型常量

    不同數據類型的整型常量表示方法不同,十進制如123,0,-89等;十六進制則以0x開頭如0x34,-0x3B等;長整型就在數字后面加字母L,如104L,034L,0xF340等。

    2. 浮點型常量

    浮點型常量可分為十進制和指數表示形式。

    十進制浮點型常量由數字和小數點組成,整數或小數部分為0,可以省略但必須有小數點,如0.888,3345.345,0.0等。

    指數浮點型常量表示形式為:[±]數字[.數字]e[±]數字

    []中的內容為可選項,如125e3,7e9,-3.0e-3等。

    3. 字符型常量

    字符型常量是單引號內的字符,如‘a’,‘d’等。表示不顯示的控制字符,可以在該字符前面加一個反斜杠“”組成專用轉義字符,常用轉義字符如表3-3所示。

    4. 字符串型常量

    字符串型常量由雙引號內的字符組成,如“test”,“OK”等。當引號內沒有字符時,為空字符串。

    在C中字符串常量是做為字符類型數組來處理的,在存儲字符串時系統會在字符串尾部加上“”轉義字符以作為該字符串的結束符。字符串常量“A”和字符常量‘A’是不同的,前者在存儲時多占用一個字節的空間。

    單片機C語言程序設計基礎知識全解析

    表3-3 常用轉義字符表

    5. 位標量

    位標量是C51編譯器的一種擴充數據類型,它的值是一個二進制位,不是0就是1。

    下面我們來看一些常量定義的例子:

    單片機C語言程序設計基礎知識全解析

    以上兩句它們的值都保存在程序存儲器中,而程序存儲器在運行中是不允許被修改的,所以如果在這兩句后面用了類似a=110,a++這樣的賦值語句,編譯時將會出錯。

    (二)變量

    變量是可以在程序運行過程中不斷變化的量,變量的定義可以使用所有C51編譯器支持的數據類型。要在程序中使用變量必須先用標識符作為變量名,并指出所用的數據類型和存儲模式,這樣編譯系統才能為變量分配相應的存儲空間。

    1. 變量的定義和作用范圍

    定義一個變量的格式如下:

    [存儲類型] 數據類型 [存儲器類型] 變量名表

    在定義格式中除了數據類型和變量名表是必要的,其它都是可選項。

    (1)存儲類型

    不同存儲類型的變量以及不同位置定義的變量具有不同的代碼有效范圍,也就是變量的作用域。在單片機程序中,按照變量的存儲類型,可以分為:自動變量、全局變量、靜態變量和寄存器變量。

    ① 自動變量

    自動變量是以關鍵字auto標識的變量類型,其一般是在函數的內部或者復合語句中使用。

    自動型變量的作用域范圍是函數或者復合語句的內部。在C51中,函數或復合語句內部定義自動變量時,關鍵字auto可以省略,即默認為自動型變量。

    在程序執行過程中,自動變量是動態分配存儲空間的。當程序執行到該變量聲明語句時,根據變量類型自動為其分配存儲空間。當該函數或者復合語句執行完畢后,該變量的存儲空間將立刻自動取消,此時,該自動變量失效,在函數或者復合語句外部將不能夠使用該變量。

    ② 全局變量

    全局變量是以關鍵字extern標識的變量類型,如果一個變量定義在所有函數的外部,即整個程序文件的最前面,那么這個變量便是全局變量。全局變量有時也稱為外部變量。

    在編譯程序時,全局變量將被靜態地分配適當的存儲空間。該變量一旦分配空間,在整個程序運行過程中便不會消失。因此,全局變量對整個程序文件都有效,即全局變量可以被該程序文件中的任何函數使用。

    ③ 靜態變量

    靜態變量以關鍵字static定義,從變量作用域來看,靜態變量和自動變量類似,作用域只是定義該變量的函數內部。如果靜態變量定義在函數外部,將具有全局的作用域。

    而從內存占用的角度,靜態變量和全局變量類似,其始終占有內存空間。

    ④ 寄存器變量

    單片機的CPU寄存器中也可以保存少量的變量,這種變量稱為寄存器變量。寄存器變量以關鍵字register聲明。

    由于單片機對CPU寄存器的讀寫十分快,因此寄存器變量的操作速度要原高于其他類型的變量。寄存器變量常用于某一變量名頻繁使用的情況,這樣做可以提高系統的運算速度。

    由于單片機資源有限,程序中只允許同時定義兩個寄存器變量。如果多于兩個,在編譯時會自動地將其他的寄存器變量當做非寄存器變量來處理。

    (2)存儲器類型

    存儲器類型的說明就是指定該變量在C51硬件系統中所使用的存儲區域,并在編譯時準確的定位。表3-4中是KEIL uVision2所能認別的存儲器類型。

    單片機C語言程序設計基礎知識全解析

    表3-4 存儲器類型

    提示

    在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位則在52芯片中才有用,并和特殊寄存器地址重疊。

    如果省略存儲器類型,系統則會按編譯模式small,compact或large所規定的默認存儲器類型去指定變量的存儲區域。

    ① small存儲模式

    small存儲模式將函數參數和局部變量放在片內RAM(默認變量類型為DATA,最大128字節)。另外所有對象包括棧都優先放置在片內RAM,當片內RAM用滿,再向片外RAM放置。

    ② compact存儲模式

    compact存儲模式中將參數和局部變量放在片外RAM(默認存儲類型是PDATA,最大256字節);通過R0、R1間接尋址。

    ③ large存儲模式

    large存儲模式將參數和局部變量直接放入片外RAM(默認的存儲類型是XDATA,最大64KB);使用數據指針DPTR間接尋址,因此訪問效率較低。

    (3)對變量進行絕對定位

    C51擴展的關鍵字_at_專門用于對變量作絕對定位,_at_使用在變量的定義中,其格式為:

    [存儲類型] 數據類型 [存儲區] 變量名1 _at_ 地址常數[,變量名2&hellip;]

    例如:

    ① 對data區域中的 unsigned char變量aa作絕對定位:

    unsigned char data aa _at_ 0x30;

    ② 對pdata區域中的 unsigned int數組cc作絕對定位:

    unsigned int pdata cc[10] _at_ 0x34;

    ③ 對xdata區域中的 unsigned char變量printer_port作絕對定位:

    unsigned char xdata printer_port _at_ 0x7fff;

    對變量絕對定位的幾點說明:

    ① 絕對地址變量在定義時不能初始化,因此不能對code型常量絕對定位;

    ② 絕對地址變量只能夠是全局變量,不能在函數中對變量絕對定位;

    ③ 絕對地址變量多用于I/O端口,一般情況下不對變量作絕對定位;

    ④ 位變量不能使用_at_絕對定位。

    2. 變量的初始化和賦值

    (1)變量的初始化

    變量的初始化是指變量在被說明的同時賦給一個初值。外部變量和靜態全程變量在程序開始處被初始化,局部變量包括靜態局部變量是在進入定義它們的函數或復合語句時才作初始化。所有全程變量在沒有明確的初始化時將被自動清零,而局部變量和寄存器變量在未賦值前其值是不確定的。

    對于外部變量和靜態變量,初值必須是常數表達式,而自動變量和寄存器變量可以是任意的表達式,這個表達式可以包括常數和前面說明過的變量和函數。

    例如:

    單片機C語言程序設計基礎知識全解析

    (2)變量的賦值

    變量賦值是給已說明的變量賦給一個特定值。

    單個變量的賦值:

    ① 整型變量和浮點變量

    賦值格式如下:

    變量名=表達式;

    例如:

    單片機C語言程序設計基礎知識全解析

    說明:

    C語言中允許給多個變量賦同一值時可用連等的方式。

    例如:

    單片機C語言程序設計基礎知識全解析

    ② 字符型變量

    字符型變量可以用三種方法賦值。

    例如:

    單片機C語言程序設計基礎知識全解析

    數組與指針

    (一)數組

    所謂數組就是指具有相同數據類型的變量集,并具有共同的名字。數組中的每個特定元素都使用下標來訪問。數組由一段連續的存儲地址構成,最低的地址對應于第一個數組元素,最高的地址對應最后一個數組元素。數組可以是一維的,也可以是多維的。

    1. 數組基本形式

    (1)一維數組

    一維數組的格式是:類型 變量名[長度];

    類型是指數據類型,即每一個數組元素的數據類型,包括整數型、浮點型、字符型、指針型以及結構和聯合。

    例如:

    int a[10];

    unsigned long a[20];

    char *s[5];

    char *f[];

    說明:數組都是以0作為第一個元素的下標,因此,當說明一個int a[16]的整型數組時,表明該數組有16個元素,a[0]~a[15],一個元素為一個整型變量。

    大多數字符串用一維數組表示。數組元素的多少表示字符串長度,數組名表示字符串中第一個字符的地址,例如在語句char str[8]說明的數組中存入“hello”字符串后,str表示第一個字母“h”所在的內存單元地址。str[0]存放的是字母“h”的ASCII碼值,以此類推,str[4]存入的是字母“o”的ASCII碼值,str[5]則應存放字符串終止符‘’。

    C語言的編譯器大多對數組不作邊界檢查。

    例如用下面語句說明兩個數組

    char str1[5],str2[6];

    當賦給str1一個字符串“ABCDEFG”時,只有“ABCDE”被賦給,“E”將會自動的賦給str2,這點應特別注意。

    (2)多維數組

    多維數組的一般格式:

    類型 數組名[第n維長度][第n-1維長度]……[第1維長度];

    例如:

    單片機C語言程序設計基礎知識全解析

    數組m[3][2]共有3*2=6 個元素,順序為:

    m[0][0],m[0][1],m[1][0],m[1][1],m[2][0],m[2][1];

    數組c[2][2][3]共有2*2*3=12個元素,順序為:

    c[0][0][0],c[0][0][1],c[0][0][2],

    c[0][1][0],c[0][1][1],c[0][1][2],

    c[1][0][0],c[1][0][1],c[1][0][2],

    c[1][1][0],c[1][1][1],c[1][1][2];

    數組占用的內存空間(即字節數)的計算式為:

    字節數=第1維長度*第2維長度*...*第n維長度*該數組數據類型占用的字節數。

    2. 數組的初始化

    數組變量的初始化如:

    單片機C語言程序設計基礎知識全解析

    數組進行初始化有下述規則:

    ① 數組的每一行初始化賦值用“{}”并用“,”分開,總的再加一對“{}”括起來,最后以“;”表示結束。

    ② 多維數組的存儲是按最右維數的變量變化最快的原則。

    ③ 多維數組存儲是連續的,因此可以用一維數組初始化的辦法來初始化多維數組。

    例如:

    單片機C語言程序設計基礎知識全解析

    ④ 對數組初始化時,如果初值表中的數據個數比數組元素少,則不足的數組元素用0來填補。

    ⑤ 對指針型變量數組可以不規定維數,在初始化賦值時,數組維數從0開始被連續賦值。

    例如:

    char *f[]={'a','b','c'};

    初始化時將會給3個字符指針賦值,即:*f[0]='a',*f[1]='b',*f[2]='c'。

    3. 數組變量的賦值

    整型數組和浮點數組的賦值,例如:

    單片機C語言程序設計基礎知識全解析

    字符串數組的賦值,例如:

    單片機C語言程序設計基礎知識全解析

    上面程序在編譯時,遇到char s[30]這條語句時,編譯程序會在內存的某處留出連續30個字節的區域,并將第一個字節的地址賦給s。當遇到strcpy函數時,首先在目標文件的某處建立一個“Good News!”的字符串。其中“”表示字符串終止,終止符是編譯時自動加上的,然后一個字符一個字符地復制到s所指的內存區域。因此定義字符串數組時,其元素個數至少應該比字符串的長度多1。

    提示

    ① 字符串數組不能用“=”直接賦值,即s=“Good News!”是不合法的。所以應分清字符串數組和字符串指針的不同賦值方法。

    ② 對于長字符串,Turbo C2.0允許使用下述方法:

    例如:

    單片機C語言程序設計基礎知識全解析

    (二)指針

    1. 指針基本形式

    指針定義的一般形式為:類型識別符 *指針變量名;

    例如:

    單片機C語言程序設計基礎知識全解析

    C51 支持一般指針(Generic Pointer)和存儲器指針(Memory_Specific Pointer)。

    (1)一般指針

    一般指針的聲明和使用均與標準C相同,不過同時還可以說明指針的存儲類型。

    例如:

    單片機C語言程序設計基礎知識全解析

    以上的long、char等指針指向的數據可存放于任何存儲器中。一般指針本身用3個字節存放,分別存儲存儲器類型、高位偏移和低位偏移量。

    (2)存儲器指針

    基于存儲器的指針說明時即指定了存貯類型,例如:

    單片機C語言程序設計基礎知識全解析

    這種指針存放時,只需1或2個字節就夠了,因為只需存放偏移量。

    2. 指針變量的初始化

    例如:

    單片機C語言程序設計基礎知識全解析

    3. 指針變量的賦值

    例如:

    main()

    {

    int *i;

    char *str;

    *i=100;

    str="Good";

    }

    *i表示i是一個指向整型數的指針,即*i是一個整型變量,i是一個指向該整型變量的地址。

    *str表示str是一個字符型指針,即保留某個字符地址。在初始化時,str沒有什么特殊的值,而在執行str=“Good”時,編譯器先在目標文件的某處保留一個空間存放“Good”的字符串,然后把這個字符串的第一個字母“G”的地址賦給str,其中字符串結尾符“”是編譯程序自動加上的。

    對于指針變量的使用要特別注意。上例中兩個指針在說明前沒有初始化,因此這兩指針為隨機地址,在小存儲模式下使用將會有破壞機器的危險。正確的使用辦法如下:

    例如:

    main()

    {

    int *i;

    char *str;

    i=(int*)malloc(sizeof(int));

    i=420;

    str=(char*)malloc(20);

    str="Good, Answer!";

    }

    上例中,函數(int*)malloc(sizeof(int))表示分配連續的sizeof(int)=2個字節的整型數存儲空間并返回其首地址。同樣(char*)malloc(20)表示分配連續20個字節的字符存儲空間并返回首地址(有關該函數以后再詳述)。由動態內存分配函數malloc()分配了內存空間后,這部分內存將專供指針變量使用。

    如果要使i指向三個整型數,則用下述方法。

    例如:

    #include

    main()

    {

    int *i;

    i=(int*)malloc(3*sizeof(int));

    *i=1234;

    *(i+1)=4567;

    *(i+2)=234;

    }

    *i=1234表示把1234存放到i指向的地址中去,但對于*(i+1)=4567,如果認為將4567存放到i指向的下一個字節中就錯了。有些C語言編譯器中只要說明i為整型指針,則(i+1)等價于 i+1*sizeof(int)同樣(i+2)等價于i+2*sizeof(int)。

    (三)數組與指針的關系

    數組與指針有密切的聯系。數組名本身就是該數組的指針,反過來,也可以把指針看成一個數組,數組名和指針實質上都是地址,但是指針是變量,可以作運算。而數組名是常量,不能進行運算。

    單片機C語言程序設計基礎知識全解析

    由上例可以看出數組和指針有如下關系:

    (p+i)=&(s[i]),*(p+i)=s[i];

    因此,利用上述表達式可以對數組和指針進行互換。兩者的區別僅在于:數組s是程序自動為它分配了所需的存儲空間;而指針p則是利用動態分配函數為它分配存儲空間或賦給它一個已分配的空間地址。

    結構與聯合

    前面介紹了C語言中的基本數據類型,在實際進行C語言程序設計時僅有這些基本類型的數據是不夠的,有時需要將一批各種類型的數據放在一起使用,從而引入了構造類型的數據——結構與聯合。

    (一)結構

    結構是-種構造類型的數據,它能將多個不同類型的數據變量組合在一起,是一種數據的集合體。組成該集合體的各個數據變量稱為結構成員,集合體使用單獨的結構變量名。結構中的各個變量之間通常具有一定的關聯性,如時間數據中的時、分、秒,日期數據中的星期、午、月、日等。結構是將一組相關聯的數據變作為一個整體來進行處理,在程序中使用結構有利于對一些復雜而又具有內在聯系的數踞進行處理。

    1. 結構變量的定義

    方法一:先定義結構類型再定義結構變量名。

    定義結構類型的一般形式為:

    struct 結構名

    {結構元素表};

    結構元素表為該結構中的各個成員(又稱為結構的域),由于結構可以由不同類型的數據組成,因此對結構中的各個成員都要進行類型說明。

    例如定義一個日期結構類型date的格式如下:

    單片機C語言程序設計基礎知識全解析

    定義好一個結構類型之后,就可用它來定義結構變量。一般格式為:

    struct 結構名 結構變量名l,結構變量名2,…,結構變量名n;

    例如:

    struct date d1,d2;

    方法二:在定義結構類型的同時定義結構變量名。

    將方法一的兩個步驟舍在一起,一般格式為:

    struct 結構名

    { 結構元素表} 結構變量名1,結構變量名2,…,結構變量名n;

    例:

    單片機C語言程序設計基礎知識全解析

    方法三:直接定義結構變量。這種方法可以省略掉結構名,又稱為無名結構,-般形式為:

    strut

    { 結構元素表} 結構變量名1,結構變量名2,…,結構變量名n;

    例如:

    單片機C語言程序設計基礎知識全解析

    方法四:用typedef命名一個結構類型(這時結構名就不太重要了)。

    例如:

    單片機C語言程序設計基礎知識全解析

    提示

    結構類型與結構變量是兩個不同的概念。定義一個結構類型時只是給出該結構的組織形式,并沒有給出具體的組織成員,結構名不占用任何存儲空間,不能對結構名進行賦值、存取和運算。而結構變量則是一個結構中的具體成員,編譯器會為具體的結構變量名分配確定的存儲空間,因此可以對結構變量名賦值、存取和運算。

    將-個變量定義為基本類型與將其定義為結構類型的不同之處是:前者只是說明變量的類型,后者不僅說明該變量為結構類型,同時還要指出該變量所屬結構類型的名字。

    一個結構中的結構元素可以是另外一個結構類型的變量,即可以形成結構的嵌套。

    例如:

    單片機C語言程序設計基礎知識全解析

    其中,結構類型mrec中的結構元素time又是另一個結構類型clock的結構變量,形成了結構的結構,即結構的嵌套,結構的嵌套可以是多層次的,但這種嵌套不能包含其自身,即結構不能自己定義自己。

    結構中的結構元素可以與結構外其他變量同名。它們各自代表不同的對象,在使用中不會互相影響。

    在定義結構變量時,還可以說明它的存儲種類,可以extern、auto和static三種形式。

    2. 結構變量的引用

    結構變量定義之后就要考慮對它的引用問題(賦值、存取、運算)。對結構變量的引用是通過所屬的結構元素的引用實現的。引用結構元素的一般格式為:

    結構變量名.結構元素

    其中“.”是存取結構元素的成員運算符。如d1.month表示結構變量d1中的成員month。如果-個結構變量中的結構元素又是另外一個結構變量.即出現結構的嵌套時,則需要采用若干個成員運算符一級一級地找到最低一級的結構元素,而且只能對這個最低級的結構元素進行訪問,例:m1.time.min。

    對結構變量中的各個元素可以像普通變量一樣進行賦值、存取和運算。

    例:

    d1.year=2006;

    sum=d1.day+d2.day;

    d1.month++;

    m1.time.hour=0x22;

    成員運算符的優先級別最高。

    對于結構變量和結構元素在程序可以直接引用它們的地址。

    例:scanf(“%d”&d1.year);

    結構變量的地址通常用作函數參數,用來傳遞結構的地址。

    3. 結構變量的初值

    當結構變量為外部全局變量或靜態變量時可以在定義結構類型時給它賦初值,但不能給自動存儲種類的動態局部結構變量賦初值。

    例如:

    單片機C語言程序設計基礎知識全解析

    自動結構變量不能在定義時賦初值,只能在程序執行中用賦值語句為各結構元素分別賦值。結構變量初值個數必須小于等于結構變量中元素的個數。初值不夠時,余下的結構變量元素以0為其初值,如果初值個數多于元素個數時則會導致編譯出錯。

    4. 結構數組

    在實際使用中,結構變量往往不止一個,通常是將多個相同的結構組成一個結構數組,結構數組的定義方法與結構變量完全一致。

    例如:

    單片機C語言程序設計基礎知識全解析

    例:結構數組賦初值

    單片機C語言程序設計基礎知識全解析

    5. 結構型指針

    (1)結構型指針的概念

    一個指向結構類型變量的指針稱為結構型指針,該指針變量的值也是它所指向的結構變量的起始地址。結構型指針也用來指向結構數組或結構數組中的元素。

    定義結構型指針的一般形式為:

    struct 結構類型標識符 * 結構指針標識符

    其中“結構指針標識符”就是所定義的結構型指針變量的名字,“結構類型標識”就是該指針所指向的結構變量的具體類型名稱。

    例:struct mepoint * mp;

    (2)用結構型指針引用結構元素

    通過結構型指針引用結構元素的一般形式為:

    結構指針→結構元素

    例:mp→pressure等同于(* mp).pressure

    6. 結構與函數

    (1)結構作為函數的參數

    一般來說,結構既可作為函數的參敏,也可作為函數的返回值。當結構被用作函數的參數時,其用法與普通變量作為實參是一樣的,其參數傳遞屬于“值傳遞”方式。

    程序在進行函數調用時,將整個結構變量作為參數傳遞給被調函數。系統為形式參數的結構變量分配存儲空間,并從相應的實際參數中取得各個元素的值。函數對形參中各個結構無素值進行的修改不會對相應的實參結構變量產生任何影響。

    (2)結構型指針作為函數的參數

    當結構較大時,若將該結構作為函數的參數,由于參數傳遞采用值傳遞方式,需要較大的存儲空間(堆棧)來將所有的結構元素壓棧和出棧,尤其當函數參數是結構數組時,影響更大,此外還會影響程序的執行速度。實際上可以用結構型指針來作為函數的參數,此時參數的傳遞是按地址傳遞方式進行的。由于采用的是地址傳遞方式,只需要傳遞一個地址值,與前者相比,既可節省存儲空間,同時還可加快程序的執行速度。缺點是在調用函數時對結構指針所作的任何變動都會影響到原來的結構變量。

    (二)聯合

    聯合也是C語言中一種構造類型的數據結構。在一個聯合中可以包含多個不同類型的數據元素。各種類型的變量放在同-個地址開始的內存單元中,實現了多層數據覆蓋,一方面有效地提高內存的利用率,另一方面也方便了數據類型間的轉換。

    1. 聯合的定義

    定義聯合類型變量的一般形式:

    union 聯合類型名

    { 成員表列 } 變量表列;

    單片機C語言程序設計基礎知識全解析

    也可以將類型定義與變量定義分開。即先定義一個union data類型,再將a、b、c定義為union data類型的變量。

    單片機C語言程序設計基礎知識全解析

    還可以直接定義聯合變量。

    單片機C語言程序設計基礎知識全解析

    由此可見,聯合類型與結構類型的定義方法是很相似的,只是將關鍵字struct改成了union。但是在內存的分配上它們之間有著本質的區別。結構變量所占用的內存長度是其中各個元素所占用內存長度的總和;而聯合變量所占用的時存長度是其中最長的元素的長度。聯合變量中的元素分時占用相同的存儲空間。

    2. 聯合變量的引用

    與結構變量類似,對聯合變量的引用也是通過對聯合元素的引用來實現的,引用聯合元素的一般格式為:

    聯合變量名.聯合元素

    聯合變量名->聯臺元素

    例:

    a.i //引用聯合變量a中的float型元素

    a.j //引用聯合變量a中的long型元素

    b.k //引用聯合變量b中的int型元素

    c.m //引用聯合變量c中的char型元素

    在引用聯合元素時,要注意聯合變量用法的一致性。因為聯合類型中定義的各個不同類型的元素都可以分時地賦給變量,而所讀取變量的值是最近放入的某一元素的值,因此在表達式中對它進行處理時,必須注意其類型要與表達式所要求的類型保持一致,否則將導致程序運行出錯。

    聯合變量不能整體引用,例如下面的寫法就是錯誤的:

    printf(“%f”,a);

    因為變量a可能是 float、long、int和char三種類型,分別占用不同長度的內存區域,若在引用時僅寫聯合變量名a,系統將難以確定究竟應該輸出哪一個聯合元素的值。

    正確的寫法為:

    printf(“%f”,a.i);

    聯合類型的數據占用的內存空間在某一時刻只能存放一種類型的元素。

    国产不卡无码视频在线观看_天天看片免费高清观看_99RE6在线视频精品免费_日本中文字幕有码在线视频