![[理學(xué)]第8章指針ppt課件_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/d79ebc94-c615-4720-9859-75c6dfaafe4a/d79ebc94-c615-4720-9859-75c6dfaafe4a1.gif)
![[理學(xué)]第8章指針ppt課件_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/d79ebc94-c615-4720-9859-75c6dfaafe4a/d79ebc94-c615-4720-9859-75c6dfaafe4a2.gif)
![[理學(xué)]第8章指針ppt課件_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/d79ebc94-c615-4720-9859-75c6dfaafe4a/d79ebc94-c615-4720-9859-75c6dfaafe4a3.gif)
![[理學(xué)]第8章指針ppt課件_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/d79ebc94-c615-4720-9859-75c6dfaafe4a/d79ebc94-c615-4720-9859-75c6dfaafe4a4.gif)
![[理學(xué)]第8章指針ppt課件_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/d79ebc94-c615-4720-9859-75c6dfaafe4a/d79ebc94-c615-4720-9859-75c6dfaafe4a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第8章 指針本章主要內(nèi)容本章主要內(nèi)容指針的根本概念指針的根本概念指針與數(shù)值型數(shù)組指針與數(shù)值型數(shù)組指針與字符數(shù)組字符串指針與字符數(shù)組字符串指針數(shù)組與指向指針的指針指針數(shù)組與指向指針的指針8.1 概述概述一、指針概念一、指針概念1 1、內(nèi)存、地址、內(nèi)存、地址內(nèi)存內(nèi)存: :存放了計算機正在運轉(zhuǎn)的程序和程序正在運用存放了計算機正在運轉(zhuǎn)的程序和程序正在運用的數(shù)據(jù)。的數(shù)據(jù)。 內(nèi)存的根本單元是字內(nèi)存的根本單元是字節(jié)節(jié)(Byte)(Byte)。地址地址: :內(nèi)存單元編號。內(nèi)存單元編號。CPUCPU給每個內(nèi)存單元一個編號給每個內(nèi)存單元一個編號變量的地址:系統(tǒng)為變量分配內(nèi)存單元地址。變量的地址:系統(tǒng)為變量分配內(nèi)存
2、單元地址。存儲內(nèi)容:內(nèi)存單元中的數(shù)據(jù)值。存儲內(nèi)容:內(nèi)存單元中的數(shù)據(jù)值。int a;int a;float b;float b;char c;char c;a=3;a=3;b=5;b=5;c=c=a a; ;2、指針變量的定義、指針變量的定義指針:就是地址。即內(nèi)存單元的編號。指針:就是地址。即內(nèi)存單元的編號。指針變量:用來存放內(nèi)存地址的變量。某一變量的地址指針變量:用來存放內(nèi)存地址的變量。某一變量的地址指針變量的定義:類型闡明符指針變量的定義:類型闡明符 *指針變量名。指針變量名。int *p; int *p=&a; p中存放地址,指向的數(shù)據(jù)是整型中存放地址,指向的數(shù)據(jù)是整型p=&
3、;a;float *q; float *q =&b; q中存放地址,指向的數(shù)據(jù)是實型中存放地址,指向的數(shù)據(jù)是實型q=&b;char *r; char *r =&c; r中存放地址,指向的數(shù)據(jù)是字符型中存放地址,指向的數(shù)據(jù)是字符型r=&c;3、訪問變量方式、訪問變量方式直接訪問方式直接訪問方式: 這種訪問方式就是按變量的地址存取變量的值這種訪問方式就是按變量的地址存取變量的值 printf%d,a; a=5;間接訪問方式間接訪問方式:經(jīng)過另一變量訪問該變量的值經(jīng)過另一變量訪問該變量的值 C言語中,允許運用一種特殊的變量,它專門言語中,允許運用一種特殊的變量,它專門
4、用來存放另外一些變量占用的存儲單元的地址。用來存放另外一些變量占用的存儲單元的地址。 printf%d,*p; *p=5;4.指針變量的援用指針變量的援用例例8.1利用指針輸出變量的值。利用指針輸出變量的值。#include void main()int a,b;int *p1,*p2;scanf(%d,%d,&a,&b);p1=&a;p2=&b;printf(%d %dn,*p1,*p2);printf(%d %dn,a,b);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:輸入:輸入:3 6 3 63 68.2 指針變量指針變量二、指針的運算二、指針的運算1 1指針運算符單目運算符,其
5、結(jié)合性為自右至左指針運算符單目運算符,其結(jié)合性為自右至左& &取地址運算符:取變量的地址取地址運算符:取變量的地址* *取內(nèi)容運算符:表示指針變量所指的變量。取內(nèi)容運算符:表示指針變量所指的變量。注:注: 在在* *運算符之后跟的變量必需是指針變量。運算符之后跟的變量必需是指針變量。 int int * *p1,p1,* *p2; p2; 和和 * *p=5; p=5; 中的中的* *不不是一回事。是一回事。 指針闡明符指針闡明符 取內(nèi)容運算符取內(nèi)容運算符 判別正確嗎?判別正確嗎?int int * *p=&a;p=&a; * *p=&a;p=&
6、a;2指針變量的運算賦值運算賦值運算指針變量初始化賦值指針變量初始化賦值.int a;int *p=&a;2) 把一個變量的地址賦予指向一樣數(shù)據(jù)類型的指針變量。把一個變量的地址賦予指向一樣數(shù)據(jù)類型的指針變量。int a,*p;p=&a; 3) 把一個指針變量的值賦予指向一樣類型變量的另一個指針把一個指針變量的值賦予指向一樣類型變量的另一個指針變量。變量。int a,*p=&a,*q;p=q;l指針變量的初始化指針變量的初始化l普通方式:普通方式: 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 * *指針名指針名= =初始地址值;初始地址值;賦給指針變量,不是賦給目的變量例 int
7、 i; int *p=&i;變量必需已闡明過類型應(yīng)一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指針變量作初值例 main( ) int i; static int *p=&i; . ()不能用auto變量的地址去初始化static型指針2指針變量的運算(2) 指針的算術(shù)運算指針的算術(shù)運算指針和整數(shù)進展加減運算指針和整數(shù)進展加減運算 int a5,*p; y=*p+5; y=+*p; y=*p+; p=a; p=p+2; 2指針的自增和自減指針的自增和自減與整數(shù)加減的本質(zhì)是一樣的。與整數(shù)加減的本質(zhì)是
8、一樣的。 p+;p-; 3) 兩個指針變量相減兩個指針變量相減表示兩地址之間可包容的相應(yīng)類型數(shù)據(jù)的個數(shù)。表示兩地址之間可包容的相應(yīng)類型數(shù)據(jù)的個數(shù)。 p1-p22指針變量的運算(3) 指針變量的關(guān)系運算指針變量的關(guān)系運算 = = !=pf1=pf2表示表示pf1和和pf2指向同一數(shù)組元素;指向同一數(shù)組元素;pf1pf2表示表示pf1處于高地址位置;處于高地址位置;pf1pf2表示表示pf2處于低地址位置。處于低地址位置。指針變量還可以與指針變量還可以與0比較。比較。#define NULL 0int *p=NULL; int *p=0; 注:指針變量未賦值時,可以是恣意值,是不能運用的。否注:指
9、針變量未賦值時,可以是恣意值,是不能運用的。否那么將呵斥不測錯誤。而指針變量賦那么將呵斥不測錯誤。而指針變量賦0值后,那么可以值后,那么可以運用,只是它不指向詳細(xì)的變量而已。運用,只是它不指向詳細(xì)的變量而已。例 main( ) int i=10; int *p; *p=i; printf(“%d,*p); 危險!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d,*p); 指針變量必需先賦值,再運用.2000200420062005整型變量i10指針變量p200120022003隨機例例8.2利用指針輸出變量的值交換指針。利用指針輸
10、出變量的值交換指針。#include void main()int a=5,b=8;int *p1,*p2,*p;p1=&a; p2=&b; printf(%d %dn,*p1,*p2); p=p1;p1=p2;p2=p; printf(%d %dn,*p1,*p2);printf(%d %dn,a,b);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:5 88 55 8例例8.3利用指針輸出變量的值交換指針?biāo)缸兞康闹?。利用指針輸出變量的值交換指針?biāo)缸兞康闹怠?include void main()int a,b,temp;int *p1,*p2;a=5;b=8;p1=&a; p2=&
11、b; printf(%d %dn,a,b);temp=*p1;*p1=*p2;*p2=temp; printf(%d %dn,a,b);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:5 88 58.3 指針與函數(shù)指針與函數(shù)三、指針與函數(shù)三、指針與函數(shù)1 1、指針作為函數(shù)參數(shù)、指針作為函數(shù)參數(shù)#include #include void swap(int x,int y )void swap(int x,int y ) int t;int t;t=x; x=y; y=tt=x; x=y; y=t void main()void main() int a=3,b=5;int a=3,b=5;swap(a, b);swap(
12、a, b);printf(printf(“%d%dn%d%dn,a,b);,a,b); #include void swap(int *x,int *y ) int t;t=*x;*x=*y;*y=tvoid main()int a=3,b=5;swap(&a,&b);printf(“%d%dn,a,b);8.3 指針與函數(shù)指針與函數(shù)三、指針與函數(shù)三、指針與函數(shù)1 1、指針作為函數(shù)參數(shù)、指針作為函數(shù)參數(shù)#include #include void swap(int x,int y )void swap(int x,int y ) int t;int t;t=x; x=y; y=
13、t;t=x; x=y; y=t; void main()void main() int a=3,b=5;int a=3,b=5;swap(a, b);swap(a, b);printf(%5d%5dn,a,printf(%5d%5dn,a,b);b); #include void swap(int *x,int *y ) int t;t=*x;*x=*y;*y=t;void main() int a=3,b=5;swap(&a,&b);printf(%d%dn,a,b);1、指針作為函數(shù)參數(shù)、指針作為函數(shù)參數(shù)2、在被調(diào)函數(shù)中改動的是指針?biāo)缸兞康闹怠⒃诒徽{(diào)函數(shù)中改動的是指針?biāo)?/p>
14、變量的值#include void swap(int *x,int *y ) int t; t=*x;*x=*y;*y=t;void main() int a=3,b=5; swap(&a,&b); printf(%5d%5dn,a,b);#include void swap(int *x,int *y ) int t;t=*x;*x=*y;*y=t;void main() int a=3,b=5,*p=&a,*q=&b;swap(p, q);printf(%5d%5dn,a,b);留意:留意:1、指針作為函數(shù)參數(shù)、指針作為函數(shù)參數(shù) 2、在被調(diào)函數(shù)中不能經(jīng)過改動
15、指針形參的值使指針、在被調(diào)函數(shù)中不能經(jīng)過改動指針形參的值使指針實參的值改動。實參的值改動。#include void swap(int *x,int *y ) int *t;t=x;x=y;y=t;void main() int a=3,b=5,*p=&a,*q=&b;swap(p, q);printf(%5d%5dn,a,b);printf(%5d%5dn,*p,*q);例題例題#include void f(int *p,int *q); main() int m=1,n=2,*r=&m; f(r,&n);printf(%d,%d,m,n); void f(
16、int *p,int *q) p=p+1;*q=*q+1; 程序運轉(zhuǎn)后的輸出結(jié)果是程序運轉(zhuǎn)后的輸出結(jié)果是A 。 A) 1,3 B) 2,3 C) 1,4 D) 2,4例題例題有以下程序有以下程序#include sub(int x,int y,int *z)*z=y-x;void main() int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(%4d,%4d,%4dn,a,b,c);程序的運轉(zhuǎn)結(jié)果是程序的運轉(zhuǎn)結(jié)果是B。 A) 5,2,3 B) -5,-12,-7 C) -5,-12,-17 D) 5,-2
17、,-7例題例題程序運轉(zhuǎn)后的輸出結(jié)果是程序運轉(zhuǎn)后的輸出結(jié)果是 A) 7,2,5,4,3,6,1 B) 1,6,3,4,5,2,7 C) 7,6,5,4,3,2,1 D) 1,7,3,5,6,2,1有以下程序函數(shù)有以下程序函數(shù)fun只對下標(biāo)為偶數(shù)的元素進展操作只對下標(biāo)為偶數(shù)的元素進展操作#include void fun (int *a,int n)int i, j, k, t; for(i=0;in-2;i+=2) k=i; for(j=i;jak) k=j; t=ai;ai=ak;ak=t; main() int aa10=1,2,3,4,5,6,7,i; fun(aa,7); for(i=0
18、;i7;i+) printf(%d,aai); printf(n);例題例題A) ABCDBCDCDD B) ABCD C) BCD D) BCDCDD答案:答案:D有如下程序有如下程序#includemain() char s=ABCD, *p;for(p=s+1;ps+4;p+) printf(%sn,p);該程序的輸出結(jié)果是該程序的輸出結(jié)果是 案例案例 /* 用指針訪問簡單變量例如用指針訪問簡單變量例如 */ #include void main() int a,b,*p1,*p2; p1 = &a; /* p1指向指向a */ p2 = &b; /* p2指向指向b *
19、/ scanf(%d%d, p1,&b); printf(a+b=%dn, *p1+*p2); 指針的根本概念指針的根本概念 指針是指針是C言語的重要特征,是言語的重要特征,是C言語訪問內(nèi)存數(shù)據(jù)和程序的靈敏言語訪問內(nèi)存數(shù)據(jù)和程序的靈敏和有效的手段。和有效的手段。 C C言語的指針支持:言語的指針支持: 函數(shù)的地址調(diào)用;函數(shù)的地址調(diào)用; 動態(tài)分配內(nèi)存;動態(tài)分配內(nèi)存; 數(shù)組的地址援用。數(shù)組的地址援用。內(nèi)存、地址、指針 (Memory ,Address, Pointer) 內(nèi)存存放了計算機正在運轉(zhuǎn)的程序和程序正在運用的數(shù)據(jù)。內(nèi)內(nèi)存存放了計算機正在運轉(zhuǎn)的程序和程序正在運用的數(shù)據(jù)。內(nèi)存的根本單元
20、是字節(jié)存的根本單元是字節(jié)(Byte)。 為了訪問內(nèi)存單元,為了訪問內(nèi)存單元,CPU給每個內(nèi)存單元一個編號,該編號稱給每個內(nèi)存單元一個編號,該編號稱為該內(nèi)存單元的地址。為該內(nèi)存單元的地址。 變量是程序中可以改動的量,當(dāng)說變量是程序中可以改動的量,當(dāng)說明變量時,系統(tǒng)將為其在內(nèi)存中開辟相明變量時,系統(tǒng)將為其在內(nèi)存中開辟相應(yīng)得內(nèi)存單元。由此確定變量的地址及應(yīng)得內(nèi)存單元。由此確定變量的地址及內(nèi)存中的表示方式。內(nèi)存中的表示方式。2000H2001H2002H2003Hint a=0;a的的內(nèi)內(nèi)存存單單元元a的地址的地址&a 假設(shè)有一變量假設(shè)有一變量p,其內(nèi)容存放了,其內(nèi)容存放了a的的地址地址&am
21、p;a,經(jīng)過,經(jīng)過p也可實現(xiàn)對也可實現(xiàn)對a的訪問,的訪問,p稱為指針,并指向稱為指針,并指向a。00H20H00p指針的闡明 指針是特殊類型的變量,其內(nèi)容是變量的地址。在運用前必需指針是特殊類型的變量,其內(nèi)容是變量的地址。在運用前必需闡明,闡明某標(biāo)識符是指針類型,并可指向某種類型的對象。闡明,闡明某標(biāo)識符是指針類型,并可指向某種類型的對象。指針的闡明格式:指針的闡明格式: type *pname1,*pnamen;標(biāo)識符命名的指針變量名。標(biāo)識符命名的指針變量名。指針標(biāo)志。指針標(biāo)志。指針指向?qū)ο蟮念愋?。指針指向?qū)ο蟮念愋?。int *p, *q; /* p、q是指向整型變量的指針。是指向整型變量的
22、指針。*/float *pfValue ,*pf; /* pfValue和和pf是指向浮點型的指針。是指向浮點型的指針。*/指針對變量的援用 定義指針的目的是經(jīng)過指針援用內(nèi)存對象,指針的援用應(yīng)按如定義指針的目的是經(jīng)過指針援用內(nèi)存對象,指針的援用應(yīng)按如下步驟進展:下步驟進展:闡明指針闡明指針 int a=0, *p;指針指向?qū)ο笾羔樦赶驅(qū)ο髉=&a;經(jīng)過指針援用對象經(jīng)過指針援用對象*p=*p+2;4.指針操作的兩種運算符:指針操作的兩種運算符:取地址運算取地址運算 & &a表示取變量表示取變量a地址的運算。地址的運算。間接運算間接運算 * *p表示取指針表示取指針p指向變
23、量內(nèi)容的運算。指向變量內(nèi)容的運算。int a,*p; 2000Happ=&a; /* p指向指向a。 */2000H*p=2;2舉例:#include void main () int x ,*p; x=55; p=&x; printf ( “ %d, %u , x, *p) ; *p=65; printf ( “ %d, %u, x, *p) ;2000Hxp2000H5565關(guān)于指針的闡明:關(guān)于指針的闡明:指針必需指向?qū)ο蠛?,才干援用。指針必需指向?qū)ο蠛螅鸥稍谩?int *p; *p=2; /* Error! */ &和和 * 為互補運算。為互補運算。int a
24、,*p; p=&a;那么:那么:&*p p *&a a4. 指針的運算 指針是特殊類型的變量,其內(nèi)容是變量的地址,因此指針的運指針是特殊類型的變量,其內(nèi)容是變量的地址,因此指針的運算及結(jié)果一定要符合地址邏輯。算及結(jié)果一定要符合地址邏輯。五種算術(shù)運算五種算術(shù)運算int a, b, *p1, *p2;p1=&a;p2=&b;a2000Hb2400Hp1p22000H2400Hp1+; /*含義指向含義指向a后的整型單元后的整型單元*/2002H2002Hp1- -; /*指向指向a前的整型單元前的整型單元*/p1+n; /*指向指向a后的第后的第n個整型單元
25、個整型單元*/p1- n; /*指向指向a前的第前的第n個整型單元個整型單元*/p2- p1; /*a和和b之間差的單元數(shù)之間差的單元數(shù)*/結(jié)果結(jié)果200Hp n 相當(dāng)于相當(dāng)于: p的實踐內(nèi)容的實踐內(nèi)容 nsizeof(*p);六種關(guān)系運算六種關(guān)系運算比較兩個同類型變量之間的地址關(guān)系。比較兩個同類型變量之間的地址關(guān)系。p1p2;指針賦值運算指針賦值運算#include void main() int a,b,*p1,*p2; a=2; b=3; p1=&a; p2=&b; *p1=*p2; printf(“%d,%dn,a,b); a=3; b=5; p1=p2; printf
26、(“%d,%d,*p1,*p2);差別差別a&a 2000Hb&b 2400Hp1p2232000H2400H指針與數(shù)值型數(shù)組指針與數(shù)值型數(shù)組 數(shù)組是同類型的變量的集合,各元素按下標(biāo)的特定順序占據(jù)一數(shù)組是同類型的變量的集合,各元素按下標(biāo)的特定順序占據(jù)一段延續(xù)的內(nèi)存,各元素的地址也延續(xù),指針對數(shù)組元素非常方便。段延續(xù)的內(nèi)存,各元素的地址也延續(xù),指針對數(shù)組元素非常方便。指針與一維數(shù)組指針與一維數(shù)組經(jīng)過指針援用數(shù)組元素可以分以下三個步驟:經(jīng)過指針援用數(shù)組元素可以分以下三個步驟:闡明指針和數(shù)組闡明指針和數(shù)組int *p,a10;指針指向數(shù)組指針指向數(shù)組p=a; /*指向數(shù)組的首地址指向
27、數(shù)組的首地址*/p=&a0; /*指向數(shù)組的首地址指向數(shù)組的首地址*/經(jīng)過指針援用數(shù)組元素經(jīng)過指針援用數(shù)組元素當(dāng)指針指向數(shù)組的首地址時,那么下標(biāo)為當(dāng)指針指向數(shù)組的首地址時,那么下標(biāo)為i的元素地址為:的元素地址為: p+i 或或a+i援用數(shù)組元素可以有三種方法:援用數(shù)組元素可以有三種方法:下標(biāo)法:下標(biāo)法: a i 指針法:指針法: *(p+i)數(shù)組名法:數(shù)組名法:*(a+i)留意:數(shù)組名是地址常量,不能改動!留意:數(shù)組名是地址常量,不能改動! a=p; /*Error!*/ / /* * 經(jīng)過指針訪問數(shù)組元素經(jīng)過指針訪問數(shù)組元素 * */ / #include #include void
28、 main() void main() double Array10,Avg, double Array10,Avg,* *Pointer;Pointer; int i; int i; Avg = 0; Avg = 0; Pointer = Array; Pointer = Array; / /* * 指針指向數(shù)組指針指向數(shù)組 * */ / for(i=0; i10; i+) for(i=0; i10; i+) scanf(%lf,Pointer + i); / scanf(%lf,Pointer + i); /* *Pointer+iPointer+i為下標(biāo)為為下標(biāo)為i i的元素地址的元素地
29、址* */ / Avg += Avg += * *(Pointer + i); /(Pointer + i); /* * 累加各個元素的值累加各個元素的值 * */ / Avg /= 10; Avg /= 10; printf(The avgerage of array is: %lfn,Avg); printf(The avgerage of array is: %lfn,Avg); 【例1】有一個具有10個元素的數(shù)組,經(jīng)過指針求其一切元素的平均值。/* 經(jīng)過指針求數(shù)組元素最大值及其位置經(jīng)過指針求數(shù)組元素最大值及其位置*/#include void main() int Array10,*i
30、pCur; /* ipCur遍歷訪問數(shù)組的指針遍歷訪問數(shù)組的指針 */ int *ipPos; /* ipPos最大元素地址最大元素地址*/ int i; ipCur = Array; /*指針指向數(shù)組指針指向數(shù)組*/ for(i=0; i10; i+) scanf(%d, ipCur+); /* ipCur為下標(biāo)為為下標(biāo)為i的數(shù)組元素的地址的數(shù)組元素的地址 */ ipPos = Array; /* 指向數(shù)組首地址指向數(shù)組首地址 */ /* 設(shè)下標(biāo)為設(shè)下標(biāo)為0的元素為最大值的元素為最大值 */ ipCur = Array + 1; 【例2】經(jīng)過指針求數(shù)組的最大值及其位置。 for(i=1; i
31、 *ipPos) ipPos = ipCur; /* ipPos保管最大元素的地址保管最大元素的地址*/ ipCur+; /*指向下一元素指向下一元素*/ printf(The max is %dn,*ipPos); printf(The position is %dn,ipPos-Array);舉例:打印數(shù)組中的奇數(shù)。舉例:打印數(shù)組中的奇數(shù)。#include void main(void ) int i ,a 10 ; for (i=0 ; i10 ; i+ ) scanf ( “ %d , &ai ) ; for (i=0 ; i10 ; i+) if ( a i % 2 ) pr
32、intf ( “ %d, a i ); 數(shù)組元素法。數(shù)組元素法。循環(huán)輸入。循環(huán)輸入。循環(huán)判別,滿足條件輸出。循環(huán)判別,滿足條件輸出。數(shù)組名法。數(shù)組名法。 a+i *(a+i)指針法。指針法。 ,*p ;p = a;p+*(p+i)結(jié)果能否結(jié)果能否正確?正確?p= a; *p=&a0;*留意指針在運算時的變化。留意指針在運算時的變化。2.指針與二維數(shù)組如下闡明數(shù)組如下闡明數(shù)組int a34=1,2,3,4,5,6,7,8,9,10,11,12;其二維構(gòu)造如下:其二維構(gòu)造如下:12345 6789101112行行列列為了便于索引,為了便于索引,C言語將數(shù)組分為兩級管理。言語將數(shù)組分為兩級管
33、理。a0a1a2 將將a了解為一維數(shù)組,了解為一維數(shù)組, 數(shù)組有三個元素,它們分別為數(shù)組有三個元素,它們分別為a0、a1,a2 。各個元素又是一個有四個元素的一維數(shù)組。各個元素又是一個有四個元素的一維數(shù)組。從地址的角度看:從地址的角度看:a 為為a0 第一行的首地址第一行的首地址a+1 為為a1 第二行的首地址第二行的首地址a+2 為為a2 第三行的首地址第三行的首地址a+1 地址一次加一行。地址一次加一行。i行行j列數(shù)組元素的地址可以由列數(shù)組元素的地址可以由a i +j得到。得到。數(shù)組名地址的兩級管理aa0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a
34、22 a23等價地址及其管理方式等價地址及其管理方式數(shù)組名是數(shù)組的地址,而且是常量,數(shù)組名是數(shù)組的地址,而且是常量,* 運算不改動其值!運算不改動其值!以下三種地址等價:以下三種地址等價:a+i*(a+i)a i 加法按行遞增加法按行遞增加法按列遞增加法按列遞增(a+1)+1*(a+1)+1差別?差別? (6)數(shù)組名表示數(shù)組元素a i j (*(a+i) j *(*(a+i)+j)*(a i +j)指針與二維數(shù)組指針與二維數(shù)組int *p, a34;p=a;aij*(p+4*i+j)等價!等價!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2 /* 求二維數(shù)組
35、最小值及其位置 */ #include void main(void) int a34,i,j; int iMinRow,iMinCol; /*iMinRow最小值的行,iMinCol最小值的列 */ for(i=0; i3; i+) for(j=0; j4; j+) scanf(%d,ai + j);/* ai+j為i行j列元素的地址 */ iMinRow = 0; iMinCol = 0; /*假定a00為最小值*/ for(i=0; i3; i+) for(j=0; j4; j+) if(*(*(a + i) + j) aiMinRowiMinCol) iMinRow = i;iMinC
36、ol = j; /* 修正i和j為新的最小值下標(biāo) */ printf(The min is a%d%d=%dn, iMinRow,iMinCol,aiMinRowiMinCol); 【例3】輸入三行四列的整型數(shù)組,求最小值及其位置。 /* 經(jīng)過指針求二維數(shù)組元素的累加和 */ #include void main(void) int i,j,a23,sum; int *p; p = (int *)a;/*p指向數(shù)組a,由于a加1加1行,轉(zhuǎn)換為整型指針*/ for(i=0; i2; i+) for(j=0; j3; j+) scanf(“%d,ai + j); /* ai + j為i行j列元素的
37、地址*/ sum = 0; for(i=0; i2; i+)for(j=0; j3; j+) sum += *(p + i*3 +j); /* 經(jīng)過指針p表示aij */ printf(The sum of a = %dn,sum); 【例4】輸入兩行三列的整型數(shù)組,經(jīng)過指針求一切元素的累加和。舉例: 在數(shù)組a中查找輸入的數(shù),輸出行列位置。#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d , &iS) ; for(i=0;i3;i+)f
38、or(j=0;j4;j+) if(iS= a i j ) printf(“iS equal to a%d %d n,i , j); 下標(biāo)法。下標(biāo)法。*(a i +j)*(*(a+i)+j)*(p+4*i+j)【例5】輸入3行4列的浮點型數(shù)組,經(jīng)過指針求數(shù)組的平均值。/* 經(jīng)過指針求二維數(shù)組的平均值經(jīng)過指針求二維數(shù)組的平均值 */#include void main(void) int i,j; float a34,fAvg; float (*p)4; p = a; /*指針指向數(shù)組指針指向數(shù)組*/ fAvg = 0; for(i=0; i3; i+) for(j=0; j4; j+) scan
39、f(“%f,pi+j); /* pi + j為為i行行j列元素的地址列元素的地址*/ fAvg += pij; /* pij表示表示aij*/ fAvg /=12; printf(The average of a = %fn,fAvg); 指針與字符串字符數(shù)組指針與字符串字符數(shù)組字符串在內(nèi)存中可以存儲為兩種方式:字符串在內(nèi)存中可以存儲為兩種方式:字符數(shù)組字符數(shù)組字符串常量字符串常量 可以使指針指向字符數(shù)組或字符串常量,經(jīng)過指針援用字符數(shù)可以使指針指向字符數(shù)組或字符串常量,經(jīng)過指針援用字符數(shù)組或字符串的各個字符。組或字符串的各個字符。1.指針與字符數(shù)組:指針與字符數(shù)組:char *chp,str
40、 =Hello!; /*闡明字符指針和字符數(shù)組闡明字符指針和字符數(shù)組*/chp=str; /*指針指向字符數(shù)組指針指向字符數(shù)組*/putchar( *(chp+2); /*經(jīng)過指針援用數(shù)組元素經(jīng)過指針援用數(shù)組元素*/2.指針與字符串:指針與字符串:char *strp; /*闡明字符指針闡明字符指針*/strp=“Hello!; /*指針指向字符串指針指向字符串*/puts(strp); /*經(jīng)過指針援用字符串經(jīng)過指針援用字符串*/闡明指針時,可以同時賦初值,如:闡明指針時,可以同時賦初值,如:char *strp=“Hello!;賦值表示將字符串的地址賦給指針!賦值表示將字符串的地址賦給指針
41、! /* 經(jīng)過指針訪問字符串常量 */ #include void main(void) char *p;/* 闡明指向字符的指針p */ int iNumOfi; p = “This is a test string; /* 指針指向字符串常量 */ iNumOfi = 0; while(*p!=0) if(*p = i) iNumOfi+; p+; printf(In the string the number of i = %dn,iNumOfi); 【例6】統(tǒng)計字符串常量中的小寫字母i的數(shù)量。/* 經(jīng)過指針訪問字符數(shù)組經(jīng)過指針訪問字符數(shù)組 */#include void main(vo
42、id) char str80, *chp; /* 闡明字符數(shù)組及指向字符的指針闡明字符數(shù)組及指向字符的指針 */ chp = str; /* 指針指向字符數(shù)組指針指向字符數(shù)組 */ gets(chp); while(*chp != 0) if(*chp = a & *chp = z) *chp -= 32;chp+; /* 指針指向下一字符指針指向下一字符 */ puts(str); 【例7】輸入字符串,將其中小寫字母轉(zhuǎn)換成大寫字符,其他的字符不變,輸出結(jié)果。舉例:將字符串中的大寫字母轉(zhuǎn)化對應(yīng)的小寫字母。#include void main(void) char *p,s80; p=s
43、; gets(p); for(;*p!=0;p+) if(*p=A&*p=Z) *p+=32; p=s; puts(p); 舉例:將無符號的八進制字符串轉(zhuǎn)換為十進制整數(shù)。#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn,n); p指向指向s數(shù)組。數(shù)組。輸入字符串。輸入字符串。sps5560n=0*8+5-05n=5*8+5-045n=45*8+6-0366指針數(shù)組和指向指針的指針 指針是存放其它數(shù)據(jù)對象地址的變量。因此,指針可以構(gòu)成數(shù)指
44、針是存放其它數(shù)據(jù)對象地址的變量。因此,指針可以構(gòu)成數(shù)組。每個數(shù)組元素為一個指針變量,且在內(nèi)存中延續(xù)存放。組。每個數(shù)組元素為一個指針變量,且在內(nèi)存中延續(xù)存放。指針數(shù)組的闡明指針數(shù)組的闡明闡明格式:闡明格式: type *數(shù)組名數(shù)組名const exp;int *p 4 ;含義是在內(nèi)存中開辟空間,并指明元素所指向的對象的類型。含義是在內(nèi)存中開辟空間,并指明元素所指向的對象的類型。p 0 p 1 p 2 p 3 數(shù)組名數(shù)組名p為數(shù)組的地址。為數(shù)組的地址。運用前必需讓各元素指向?qū)ο?。運用前必需讓各元素指向?qū)ο?。int i, a34, *p3;for(i=0;i3;i+) p i =a i ;*(p2+
45、1)=2; /*經(jīng)過指針數(shù)組援用數(shù)組元素經(jīng)過指針數(shù)組援用數(shù)組元素a21*/ /* 經(jīng)過指針數(shù)組訪問二維數(shù)組經(jīng)過指針數(shù)組訪問二維數(shù)組 */ #include void main(void) int a34; int *p3; /* 闡明行數(shù)一樣的指針數(shù)組闡明行數(shù)一樣的指針數(shù)組 */ int i,j; int iSumOfPosi,iCountOfPosi; for(i=0; i3; i+) pi = ai; /* 指針數(shù)組元素指向?qū)?yīng)的行指針數(shù)組元素指向?qū)?yīng)的行 */ for(j=0; j4; j+) scanf(%d,pi + j); iSumOfPosi = 0; iCountOfPosi
46、=0;【例8】統(tǒng)計3行4列整型二維數(shù)組中正數(shù)的個數(shù),并求正數(shù)的累加和,輸出結(jié)果。 for(i=0; i3; i+) for(j=0; j 0) iSumOfPosi += *(pi+j); /* 經(jīng)過指針數(shù)組訪問二維經(jīng)過指針數(shù)組訪問二維數(shù)組數(shù)組 */ iCountOfPosi+; printf(The sum of posi-numb in array is %dn,iSumOfPosi); printf(The number of posi-numb in array is %dn,iCountOfPosi); 指針數(shù)組的運用舉例經(jīng)過指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。經(jīng)過指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。#include vo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 各類建筑工程施工方案設(shè)計
- 垃圾填埋場項目可行性研究報告
- 做東南亞跨境電商平臺
- 肉鴨養(yǎng)殖項目可行性研究報告
- 大數(shù)據(jù)時代企業(yè)數(shù)據(jù)安全管理制度手冊
- 動力電池再生利用
- 三農(nóng)村電氣化工程作業(yè)指導(dǎo)書
- 高職護理婦產(chǎn)科復(fù)習(xí)測試卷附答案
- 附件3醫(yī)院護類人員年終理論考試500題練習(xí)試題附答案
- 智能環(huán)保與資源利用作業(yè)指導(dǎo)書
- 2023年韶關(guān)北江實驗學(xué)校小升初招生數(shù)學(xué)題
- 眼科學(xué)基礎(chǔ)本科
- 小沈陽《四大才子》歡樂喜劇人臺詞
- 交通安全設(shè)施作業(yè)指導(dǎo)書
- 優(yōu)秀員工榮譽證書模板
- 神奇的電家長課堂
- 城南舊事讀書匯報教學(xué)課件
- 不銹鋼容器制造通用標(biāo)準(zhǔn)工藝守則
- 校園環(huán)境衛(wèi)生檢查及記錄表
- 合同能源管理合同范本模板
- Q∕SY 05006-2016 在役油氣管道 第三方施工管理規(guī)范
評論
0/150
提交評論