語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七章編譯預(yù)處理作用:對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C源程序種類宏定義

#define文件包含

#include條件編譯

#if--#else--#endif等格式:“#”開(kāi)頭占單獨(dú)書寫行語(yǔ)句尾不加分號(hào)7.1

宏定義不帶參數(shù)宏定義#define”作語(yǔ)法宏體可缺省,表示宏名定義過(guò)或取消宏體定義位置:任意(作如用域#d:從efi定ne義#define#undef可終止格式#:defi#nuen宏展開(kāi):預(yù)編檢查標(biāo)宏d譯

不一般形式:

#define

宏名

[宏體]功能:用指定

例YES 1

(宏體)#definemain(){……..}#undef

YES#define

YES

0max(){……..}YES原作用域YES新作用域宏展開(kāi):預(yù)編譯時(shí),用宏體替換宏名---不作語(yǔ)法檢查如

if(x==YES)

printf(“correct!\n”);宏\n”);n”);()引號(hào)中的內(nèi)容el與se宏if

名(x=相=同NO也)不置pr換intf(“error!\n”);例

#define

PI

3.14159printf(“2*PI=%f\n”,PI*2);宏展開(kāi):printf(“2*PI=%f\n”,3.14159*2);??宏定義中使用必要的括號(hào)()例

#define

WIDTH

80#define

LENGTH

(WIDTH+40)var=LENGTH*2;宏展開(kāi):var=(80+40)*2;宏展開(kāi):var= 80+40

*2;帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)

宏體I*r*r”例

#define

S(a,b)

a*b………..area=S(3,2);宏展開(kāi):

area=3*2;宏展開(kāi):形參用實(shí)參換,其它字符保留宏體及各形參外一般應(yīng)加括號(hào)()例

#define

POWER(x)

x*xx=4;

y=6;z=POWER(x+y);宏展開(kāi):z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開(kāi):z=((x+y)*(x+y));(x)>(y)?(x):(y)#define

MAX(x,y)…….main(){

int

a,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開(kāi):t=(a+b)>(c+d)?(a+b):(c+d);int max(int

x,int

y){

return(x>y?x:y);main(){ int

a,b,c,d,t;…….t=max(a+b,c+d);………}例

用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能等價(jià)}帶參的宏與函數(shù)區(qū)別處帶參宏函數(shù)理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類型無(wú)類型問(wèn)題定義實(shí)參,形參類型處理過(guò)程不分配內(nèi)存簡(jiǎn)單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參程序長(zhǎng)度變長(zhǎng)不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間7.2

文件包含功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式:

#include或

#include“文件名”<文件名>#include

“file2.cfile1.cfile2.cfile1.cAA處理過(guò)程

預(yù)取該預(yù)處理<>直接按標(biāo)準(zhǔn) 搜索文件編譯“”先在當(dāng)前 搜索,再搜索標(biāo)準(zhǔn)可指定路徑被包含文件內(nèi)容源文件(*.c)頭文件(*.h)文件包含可嵌套file1.cAfile3.cC#include

“file2.c#”include

“file3.c”file2.cBfile1.cAfile3.cfile2.c例文件包含舉例/*

powers.h

*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))#include

<stdio.h>#include

"d:\fengyi\bkc\powers.h"#define MAX_POWER

10void

main(){ intn;printf("number\texp2\t

exp3\t

exp4\n");printf("----\t----\t-----\t------\n");for(n=1;n<=MAX_POWER;n++)printf("%2d\t

%3d\t

%4d\t

%5d\n",n,sqr(n),cube(n),quad(n));}第八章指針8.1

概述C程序設(shè)計(jì)中使用指針可以:使程序簡(jiǎn)潔、緊湊、高效有效表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)分配內(nèi)存方便使用字符串有效使用數(shù)組調(diào)用函數(shù)時(shí)可以得到多于1個(gè)的值直接處理內(nèi)存地址8.2

指針的概念一、數(shù)據(jù)的存取1、內(nèi)存地址內(nèi)存的每個(gè)字節(jié)都有一個(gè)編號(hào),這個(gè)

稱為“內(nèi)存地址”。低地址高地址2000200220043000程序中的每個(gè)數(shù)據(jù)都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址,從該地址開(kāi)始的一個(gè)或多個(gè)字節(jié)用來(lái)存放該數(shù)據(jù)。int i,

j,

k;ijk00000011000000000000010100000000…2、內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容的區(qū)別:若i=3,j=5;從圖中可以看出它們的區(qū)別。程序編譯后已經(jīng)沒(méi)有i、j、k這些變量名了,而是將變量名轉(zhuǎn)換為變量的地址,計(jì)算機(jī)通過(guò)內(nèi)存地址對(duì)變量進(jìn)行存取。二、直接1、直接低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000…和間接方式:按變量的地址存取變量的方式①、i=3; ②、j=i+2;③、printf("%d",i);④、scanf("%d",&i);⑤、k=i+j;如何執(zhí)行?2、間接 方式:C語(yǔ)言中可以定義整型變量、實(shí)型變量、字符型變量,各自存放相應(yīng)類型的數(shù)據(jù);另外還可以定義和使用一種特殊類型的變量,用來(lái)存放變量的地址。低地址高地址2000200220043000ijk假設(shè)已經(jīng)定義變量ip用來(lái)存放整型變量的地址,它被分配到內(nèi)存單元3000和3001。ip000000110000000000000101000000000000100000000000…2000通過(guò)執(zhí)行語(yǔ)句:ip=&i;

將整型變量i的地址存放到變量ip中,即ip的值為變量i所對(duì)應(yīng)的內(nèi)存單元的起始地址2000?,F(xiàn)在要存取i的值可以這樣做:先找到存放i的地址的內(nèi)存單元地址(3000和3001),從中取出變量i的地址(2000),然后再對(duì)2000和2001單元進(jìn)行存取——這就稱為間接 。2000ip3000

2000i變量ip的值為2000,即變量i的地址,這樣就在ip和i

之間建立了一種聯(lián)系:通過(guò)變量ip知道變量i的地址,從而找到變量i的內(nèi)存單元,因此說(shuō)變量ip指向變量i,用箭頭表示這種“指向”關(guān)系。3、關(guān)于“指向”的含義:4、為了表示將數(shù)值10送到變量i中,可以有兩種表示方法:2000①、將10送到變量i所標(biāo)志的單元中;i10②、將10送到變量ip所指向的單元中;20003000ip2000i10三、指針與指針變量通過(guò)地址能找到所需的變量單元,可以說(shuō):地址

“指向”該變量單元。因此,把一個(gè)變量的地址稱為該變量的“指針”。高地址低地址2000200220043000ijkip000000110000000000000101000000000000100000000000…2000如果一個(gè)變量專門用來(lái)存放另一個(gè)變量的地址,則稱它為“指針變量”。指針變量的值(即指針變量中存放的值)是指針(地址)。注意區(qū)分“指針”和“指針變量”這兩個(gè)概念?!?..2000整型變量i10變量i_pointer20012002200320042005–指針與指針變量2000指針:一個(gè)變量的地址指針變量:專門存放變量地址的變量指針指針變量變量的內(nèi)容變量的地址變量指針變量變量地址(指針)變量值指向地址存入指針變量①、程序中定義的每個(gè)變量在編譯后都占有各自的內(nèi)存單元,系統(tǒng)是通過(guò)內(nèi)存地址對(duì)變量進(jìn)行存取的;②、數(shù)據(jù)所占有的內(nèi)存單元個(gè)數(shù)是由其數(shù)據(jù)類型決定的③、首地址:即第一個(gè)單元的地址;④、表示地址的數(shù)與整數(shù)的區(qū)別;⑤、變量i、j的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的, 不必關(guān)心。四、說(shuō)明8.3指針變量的定義和指針運(yùn)算符:*為了表示指針變量和它所指向的變量之間的聯(lián)系,用“*”表示指向的關(guān)系。如:ip代表指針變量,*ip表示ip所指向的變量。即*ip也代表一個(gè)變量。例:①、若:ip=&i;i=5;②、x=i+1;*ip=5;

結(jié)論:*ip與i等價(jià)。x=*ip+1;取地址運(yùn)算符:&它與一個(gè)變量連用,以得到該變量的內(nèi)存地址。說(shuō)明:①、取地址運(yùn)算符只能作用于變量:&x,&a[5];不能作用于常量、表達(dá)式或寄存器變量:

&25,

&(i+1);②、不能把整數(shù)賦值給一個(gè)指針變量:ip=3000;③、不能把一個(gè)指針變量的值賦值給一個(gè)整型變量:x=ip;–&與*運(yùn)算符含義結(jié)合性:自

左含義:取?變量含義:取指針?biāo)赶蜃兞康膬?nèi)容單目運(yùn)算符兩者單關(guān)目運(yùn)系算:符互為逆運(yùn)算優(yōu)先級(jí):?2理解優(yōu)先級(jí):2整型變量i變量i_pointer2000200120022003200420052006指針變量…...102000i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)

&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointer&i_pointeripointer

&i

&(*i

pointer)iii_pointer

=

&i

=

&(*i_pointer)i

=*i_pointer

=*(&i)8.3.1

指針變量的定義與賦值法標(biāo)識(shí)符指針變量類型表示定義指針變量指不是‘*’運(yùn)算符例

int

*p1,*p2;float

*q

;static

char

*name;一、指針變量的定義[

類型]

數(shù)據(jù)類型

*指針變量名;說(shuō)明:①“*”只表示定義的變量為指針變量,但指針變量名中并不包含“*”;"*"是指針變量的標(biāo)志,不可丟②掉指;針變量定義時(shí),指定了它所指向的變量的數(shù)據(jù)類型;指針變量定義時(shí)必須指定其所指向的變量的數(shù)據(jù)類型,而且使用過(guò)程中只能指向同一種類型的變量。③

指針變量定義后,系統(tǒng)為變量分配一個(gè) 單元,用來(lái)存放地址;根據(jù)

單元的長(zhǎng)度分為大

模式(長(zhǎng)指針,4

Byte)和小 模式(短指針,2Byte);④指針變量定義后,若不賦值,其值是不確定的。二、指針變量的賦值1、賦值語(yǔ)句:int i,

j,

*p1,

*p2;p1=&i;

p2=&j;char ch,

*cp1,

*cp2;cp1=&ch;

cp2=&ch;2、初始化:int i,

*p1=&i;int i,

*p1;p1=&i;一般形式:[

類型]數(shù)據(jù)類型*指針變量名=初始地址值;賦給指針變量,不是例

inti;int

*p=&i;變量必須已說(shuō)明過(guò)類型應(yīng)一致例

int

i;int

*p=&i;int

*q=p;用已初始化指針變量作初值例

main(

){

int

i;static

int*p=&i;..............}()不能用auto變量的地址去初始化static型指針3、說(shuō)明:①、指針變量定義后,若不賦值,其值是不確定的;②、可以給指針變量賦空值(NULL),使指針變量不指向任何變量;ip=NULL;

#define

NULL

0③、指針變量的值為空值(NULL)與未對(duì)指針變量賦值,意義不同;④、只能是同類型變量的地址進(jìn)行賦值;int i,

*ip;char ch,

*cp;ip=&i;cp=&ch;ip=&ch;cp=&i;⑤、可以將數(shù)組名或函數(shù)名賦給某些類型的指針變量;int

a[10],

*ip;

ip=&a;

ip=a;⑥、不能將一個(gè)整型量(或任何其它非地址類型的數(shù)據(jù))賦給一個(gè)指針變量;

int

*ip;ip=3000;8.3.2

指針變量的ap1p2&a&a3iinntt

aa,,

**pp11,,

**pp22;;

pp11==&&aa;;printf("%x",

p1);pp22==pp11;;**pp11==33;;

pprriinnttff((""%%dd"",,

**pp11));;1、兩個(gè)運(yùn)算符:&和*&:取地址運(yùn)算符;*:指針運(yùn)算符(間接 符);2、說(shuō)明:①、&既可作用于一般變量,也可作用于指針變量;②、*只能作用于指針變量;③、表達(dá)式中的*p與變量定義中的*p含義不同;int i,

*p=&i;*p=5;④、int a,

*p=&a;int a,

*p;p=&a;int a,

*p;*p=&a;3、指針變量可以進(jìn)行的操作:int a,

*p1

*p2;①、賦值:

p1=&a;

p2=p1;②、輸出:

printf("%x",

p1);③、取內(nèi)容:*p1=5;a=5;printf("%d",

*p1);#include

<stdio.h>voidmain(

){

int a1=11,

a2=22;int *p1,

*p2;p1=&a1;p2=&a2;printf("%d,

%d\n",

*p1,

*p2);p2=p1;printf("%d,

%d\n",

*p1,

*p2);}11a122a2p1p2&a1*p1&a1*p2多個(gè)指針可以指向同一個(gè)單元。但在某一時(shí)刻,一個(gè)指針變量只能指向一個(gè)單元,因?yàn)橹羔樧兞吭谀骋粫r(shí)刻只能存放一個(gè)變量的地址值。#include

<stdio.h>void

main(

){

int a1=11,

a2=22;int *p1,

*p2,

*p;p1=&a1;p2=&a2;printf("%d,

%d\n",*p1,

*p2);p=p1;p1=p2;p2=p;printf("%d,

%d\n",

*p1,

*p2);}11a122a2p2&a&ap

&a1p1

&a2*p1&a1*p2使兩個(gè)指針交換指向#include

<stdio.h>void

main(

){

int a1=11,

a2=22,

t;int *p1,*p2;p1=&a1;p2=&a2;printf("%d,

%d\n",

a1,

a2);t=*p1;*p1=*p2;*p2=t;printf("%d,

%d\n",

a1,

a2);}a1a2tp1p2&a1*p1&a2*p2112211交換兩個(gè)指針變量所指向變量的值反映了指針變量的 方法:①、將變量的地址賦給指針變量(p1=&a1)②、將一個(gè)指針變量賦給另一個(gè)指針變量(p2=p1)③、通過(guò)指針變量間接 它所指向的變量(*p1)4、*和&運(yùn)算符的進(jìn)一步說(shuō)明:①、若有:p1=&a;

則*p1等價(jià)于a;&*p1&(*p1)&a②、*&a*(&a)*pa③、(*p)++等價(jià)于:a++

不同于:*p++*p++*(p++)8.3.3指針作為函數(shù)參數(shù)輸入兩個(gè)整數(shù)a、b,按大小順序輸出。#include

<stdio.h>void

swap(int

x,

int

y){ int

temp;temp=x;x=y;y=temp;}void

main(

){ int

a,

b;printf("\nInput

a,

b:

");scanf("%d%d",&a,

&b);if

(a<b)swap(a,

b);printf("max=%d,

min=%d\n",

a,

b);}注意:C語(yǔ)言中的函數(shù)調(diào)用采用

“傳值”方式,即單向傳遞方式。即:主調(diào)函數(shù)可以將實(shí)參的值傳遞給被調(diào)函數(shù)的形參,但不能通過(guò)改變形參的值而改變實(shí)參的值。#include

<stdio.h>void

swap(int

*px,

int

*py){ int

temp;temp=*px;*px=*py;*py=temp;}void

main(

){

int a,

b,

*p1,

*p2;printf("\nInput

a,

b:

");scanf("%d%d",

&a,&b);p1=&a;

p2=&b;if

(a<b)swap(p1,

p2);printf("max=%d,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論