第一篇:C語言程序設(shè)計教案 第十章指針
第十章 指 針
課題:
教學(xué)目的: 教學(xué)重點: 教學(xué)難點: 第十章 指針
§1-§2
1、了解指針與地址的概念
2、掌握指針變量的定義、初始化及指針的運算 指針變量的定義、初始化及指針的運算
指針的運算
步驟一 復(fù)習(xí)引導(dǎo)
指針是C語言的一個重要概念,也是C語言的一個重要特色。正確而靈活地運用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時能得到多于1個的值;能直接處理內(nèi)存地址等,這對設(shè)計系統(tǒng)軟件是很必要的。
指針的概念比較復(fù)雜,使用也比較靈活,因此初學(xué)者時常會出錯,務(wù)請在學(xué)習(xí)本章內(nèi)容時十分小心。
步驟二 講授新課
§10.1 地址和指針的概念
計算機的主存儲器被分成一個個存儲單元,為了區(qū)分各存儲單元,要為每個存儲單元編號,這個編號即地址。
例:i =3;
或 scanf(“%d”, &i);
是將3送給 i所在的空間。
例:將3送到變量I_pointer所“指向”的單元(即I所標(biāo)志的單元)。
所謂“指向”,是通過地址來體現(xiàn)的,I_pointer中的值為2000,它是變量I 的地址,這樣就在I_pointer和變量之間建立起一種聯(lián)系,即通過I_pointer能知道I的地址,從而找到變量I的內(nèi)存單元。因而在C語言中,將地址形象化地稱為“指針”。
意思是通過它能找到以它為地址的內(nèi)存單元。一個變量的地址稱為該變量的“指針”。
內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容是兩個不同的概念。
指針:就是地址,即內(nèi)存單元的編號。
指針變量:用來存放另一變量的地址(即指針)的變量。
如:地址2000是變量 i的指針;i_pointer是指針變量,其值就是指針2000。
§10.2變量的指針和指向變量的指針變量
變量的指針就是變量的地址。
存放變量地址的變量是指針變量,用來指向另一個變量。
*i_pointer 表示 i_pointer 所指向的變量。
一、定義一個指針變量
指針變量的定義包含三個方面的內(nèi)容:
⑴ 指針類型說明,即定義變量為一個指針變量 ⑵ 指針變量名
⑶ 變量值(指針)所指向的變量的數(shù)據(jù)類型。格式:
存儲類型
基類型
*指針變量名;例:int *pointer_1, *pointer_2;
float *pointer_3;
char *pointer_4;
二、指針的引用
指針變量有兩個運算符: & :取地址運算符
功能:取變量地址;單目,右結(jié)合。
* :取內(nèi)容運算符(“間接訪問”運算符)
功能:只能跟地址,取變量所指向單元的內(nèi)容;單目,右結(jié)合。
例:&a為變量a的地址,*p 為指針變量p所指向的存儲單元。
例:int a=5, *p=&a;
printf(“%d”, *p);main(){ int a,b;
int *pointer_1,*pointer_2;
a=100;b=10;
pointer_1=&a;
/*把變量a的地址賦給pointer_1*/
pointer_2=&b;
/*把變量b的地址賦給pointer_2*/
printf(“%d,%dn”,a,b);
printf(“%d,%dn”,*pointer_1, *pointer_2);} 輸出結(jié)果:100, 10
100, 10
評注:
1、在第3行雖然定義了兩個指針變量,只是提供了兩個指針變量,但并未指向任何一個整型變量。稱為指針“懸空”。
2、最后一行的*pointer_1和pointer_2就是變量a和b。
3、程序中兩處出現(xiàn)*pointer_1等,含義不同。程序第3行中的*pointer_1表示定義指針變量pointer_1。它前面的*只是表示該變量是指針變量。程序最后一行中的*pointer_1則代表變量,即pointer_1所指向的變量。
4、第5行中的pointer_1=&a 是將a的地址賦給指針變量pointer_1,而不是*pointer_1。
注意:不應(yīng)寫成:*pointer_1=&a;
5、從上例中可看出,*pointer_1等價于a,*pointer_2等價于b,故凡在程序中出現(xiàn)a的地方均可用 *pointer_1 代替。所以,若有: int x, y, *px=&x;則下面的運算均是正確的: y=*px+1;
/*把 x 的內(nèi)容加1 送變量y*/ printf(“%dn”, px);
/*打印當(dāng)前x 的內(nèi)容*/ d=sqrt((double)px);
/*把x的平方根送變量d*/ px=0;
/*把 x 置為0*/ *px+=1;
/*把 x 的值加 1*/(*px)++;
/*使 x 的值加 1*/ y=(*px)++;
/*即y=x, x++*/
6、假設(shè)px和py都被定義為指向int 對象的指針,而且px當(dāng)前已指向了int 型變量x,則執(zhí)行:
py=px;
/*把指針px的內(nèi)容拷貝到指針py中去*/ 即
py和px 這兩個不同的指針指向了同一對象x
7、指針不是整數(shù),不能將它與整數(shù)混為一談。例:
# include
例如:
# include
b = d;
printf(“%d n”, b);
……
}——編譯不出錯,但得不到希望的值
關(guān)于&和*運算符的說明:
假設(shè)已執(zhí)行
pointer_1=&a;
1、&*pointer_1含義是什么?
&*pointer_1與&a相同,即變量a的地址。
2、*&a的含義是什么?
先進(jìn)行&a運算,得a的地址,再進(jìn)行*運算。
*&a、*pointer_1及變量a等價。
3、(*pointer_1)+ + 相當(dāng)于a + +。
它與*pointer_1 + + 不同。
4、*pointer_1 + + 等價于*(pointer_1 + +),即先進(jìn)行*運算,得到a的值,然后使pointer_1的值改變,這樣pointer_1不再指向a了。
例10.2:輸入a和b兩個整數(shù),按先大后小的順序輸出a和b。
main(){ int *p1,*p2,*p, a, b;
scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a
{p=p1;p1=p2;p2=p;}
printf(“n a=%d,b=%dn”,a,b);
printf(“max=%d,min=%dn”,*p1,*p2);
} 運行情況: 5,9
三、指針變量作為函數(shù)參數(shù)
例10.3對輸入的兩個整數(shù)按大小順序輸出。先考察如下程序,看是否能得到預(yù)期的結(jié)果
swap(int p1, int p2){ int temp;temp = p1;p1 = p2;p2 =temp;} main(){ int a, b;
scanf(“%d, %d”, &a, &b);
if(a
printf(“n%d,%dn”,a,b);} 不能得到預(yù)期的結(jié)果。改為:
swap(int *p1,int *p2){ int temp;
temp = *p1;
*p1 = *p2;
*p2 =temp;} main(){ int a,b;
int *pointer_1,*pointer_2;
scanf(“%d,%d”,&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a
swap(pointer_1,pointer_2);
printf(“n%d,%dn”,a,b);}
注:如果想通過函數(shù)調(diào)用得到n個改變的值,可以:
1、在主調(diào)函數(shù)中設(shè)n 個變量,用n個指針變量指向它們;
2、然后將指針變量作實參,將這n 個變量的地址傳給所調(diào)用的函數(shù)的形參;
3、通過形參指針變量,改變該n個變量的值;
4、主調(diào)函數(shù)中就可以使用這些改變了值的變量。
四、指針(變量)的初始化 指針置初始化值的格式:
存儲類型
基類型
*指針名=初始化值; 如:main()
{ static int a;
int *p=&a, *p1=p;
…… } 再如: int *p = 0;
或
int *p = NULL;
五、指針的運算
1、指針的算術(shù)運算
指針僅能進(jìn)行加、減算術(shù)運算
如:p+n , p-n , p++ , p--, ++p ,--p
p-= n , p+= n , p1-p2 等 其中n是整數(shù),p、p1、p2均為指針;
施行加法運算時,指針向地址增大的方向移動; 施行減法運算時,指針向地址減小的方向移動; 移動長度取決于指針的基類型,由計算機決定; 如有:int a,b,c, *pt =&a;
則
pt++ 則指針向后移動兩個字節(jié); 再如:main()
{ int *p1,a=8,b=3;
p1=&a;
printf(“%d,%dn”,(*p1)++, *p1++);
printf(“%d,%dn”,a, *p1);
} 運行結(jié)果:3,8,4 注:p1+k = p1+k*sizeof(p1的基類型);
p1-k = p1-k*sizeof(p1的基類型);如:
strlen(char *s)
{ char *p=s;
while(*p!=? 主站蜘蛛池模板: 一个添下面两个吃奶把腿扒开| 夫前人妻被灌醉侵犯在线| 极品尤物一区二区三区| 伊人情人色综合网站| 国产精品久久久久9999不卡| 国产婷婷色一区二区三区在线| 午夜色大片在线观看免费| 六月丁香亚洲综合在线视频| 精品国产人成亚洲区| 美女极度色诱视频国产| 国产色视频免费| 野外亲子乱子伦视频丶| 欧美性猛交xxxx免费看| 国产 字幕 制服 中文 在线| 色婷婷亚洲婷婷7月| 边做边流奶水的人妻| 精品国产天堂综合一区在线| 无码av免费一区二区三区试看| 色综合久久一区二区三区| 韩国精品福利一区二区三区| 国产疯狂伦交大片| 丰满少妇高潮惨叫正在播放| 日韩 欧美 国产 一区三| 成人性生交大片免费看| 精品亚洲一区二区三区在线观看| 无遮挡激情视频国产在线观看| 欧洲美熟女乱又伦| 少妇无码一区二区三区免费| 国产精品ⅴ无码大片在线看| 亚洲综合av色婷婷| 久久se精品一区精品二区| 久久国产热精品波多野结衣av| 天天爱天天做天天添天天欢| 久久久久 亚洲 无码 av 专区| 中国鲜肉gay高中xx禁18网站| 动漫啪啪高清区一区二网站| 精品国产人成亚洲区| 中文字幕人成无码人妻综合社区| 亚洲国产精品久久一线不卡| 亚洲精品无码av中文字幕| 亚洲乱码日产精品一二三|