




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025海南省安全員B證考試題庫(kù)附答案
- 武漢設(shè)計(jì)工程學(xué)院《火電廠煙氣凈化Ⅰ》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖北科技學(xué)院《生物技術(shù)制藥B》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川科技職業(yè)學(xué)院《房屋建筑與實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 荊門職業(yè)學(xué)院《雷達(dá)信號(hào)分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 黑龍江三江美術(shù)職業(yè)學(xué)院《BIM技術(shù)與軟件應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 長(zhǎng)春早期教育職業(yè)學(xué)院《紡織品實(shí)驗(yàn)與設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年河北省部分重點(diǎn)中學(xué)高三上學(xué)期12月聯(lián)考?xì)v史試卷
- 廣西民族師范學(xué)院《連鎖經(jīng)營(yíng)管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 青島求實(shí)職業(yè)技術(shù)學(xué)院《商務(wù)禮儀E》2023-2024學(xué)年第二學(xué)期期末試卷
- 潔凈空調(diào)負(fù)荷計(jì)算表格
- 瀘州食品安全承諾書
- 《機(jī)械基礎(chǔ)》課程標(biāo)準(zhǔn)
- 大理市房地產(chǎn)市場(chǎng)調(diào)研報(bào)告
- 倉(cāng)庫(kù)固定資產(chǎn)管理規(guī)范
- 企業(yè)關(guān)停方案
- 陰道分泌物檢驗(yàn)
- 企業(yè)安全文化建設(shè)導(dǎo)則
- 職業(yè)技能等級(jí)認(rèn)定管理制度匯編
- 八年級(jí)語(yǔ)文上冊(cè)第六單元作業(yè)設(shè)計(jì) 品格與志趣
- C++面向?qū)ο蟪绦蛟O(shè)計(jì)雙語(yǔ)教程(第3版)課件全套 ch01Introduction-ch08Templates
評(píng)論
0/150
提交評(píng)論