




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、使用指針訪問數(shù)據(jù)C語言程序設(shè)計 單元八導學【問題1】【問題2】一維數(shù)組是占用連續(xù)存儲空間的數(shù)據(jù),如何通過指針變量對這段內(nèi)存空間進行操作?有一個整型變量a,如何知道該變量的存儲地址?如何通過指針變量對a進行操作?目錄2用指針操作一維數(shù)組3用指針操作二維數(shù)組4用字符指針操作字符串1地址與指針 地址與指針5返回地址的函數(shù)1地址與指針內(nèi)存地址編號就是內(nèi)存地址變量m變量a占1字節(jié)占4字節(jié)2000 2001 2002 2003 2004 2011 #include stdio.hvoid main() char m; int a; scanf(“%c”,&m); scanf(“%d”,&a); 內(nèi)存是以字
2、節(jié)為單位的連續(xù)的存儲空間。b1輸入:b輸入:11地址與指針變量的存儲地址2000 2001 2002 2003 2004 2011 b1 變量存儲空間的第一個字節(jié)對應(yīng)的內(nèi)存地址可看作是存儲地址。變量m變量a存儲地址 根據(jù)存儲地址就可找到相應(yīng)的存儲單元,所以通常也把地址稱為指針?!奥窐松系牡刂贰笨捎弥羔槺硎?。1地址與指針指針變量 C 語言允許用一種類型的變量來存放指針。指針變量 指針變量的值就是某個內(nèi)存單元的存儲地址。 設(shè)指針變量pm、pa分別存放變量m、a的存儲地址。pa=&a pa的存儲地址為2001 2000 2001 2002 2003 2004 2011 b1變量m變量a存儲地址pm=
3、&m pm的存儲地址為2000 1地址與指針指針變量的定義a*a普通變量指針變量int a;普通變量 a的定義int a;指針變量 a的定義*類型標識符 * 指針變量名;【形式】“指針變量名”前的“*”表示該變量是指針變量,不能省略?!邦愋蜆俗R符”表示該指針變量所指向的變量的數(shù)據(jù)類型。 一個指針變量只能指向同一類型的變量?!菊f明】1地址與指針指針變量的定義示例int * p; /定義int型指針變量,變量名為pfloat * pf; /定義float型指針變量,變量名為pfchar * pc; /定義char型指針變量,變量名為pcint *p;int n; p=&n; 等價于int *p=&
4、n; &npnnp指針表示簡化的指針表示1地址與指針指針變量的定義示例char str20; /定義char型變量名為str的一維字符數(shù)組gets(ps); /為ps所指向的內(nèi)存空間輸入字符串char *ps;ps=str; 等價于char *ps=str; 等價于gets(str);【注意】指針變量也可以被初始化為NULL,它的值為0。當指針值為零時,指針不指向任何有效數(shù)據(jù),也稱為空指針。1地址與指針指針變量的基本使用int n=10;int *p=&n; 如何引用指針變量p輸出n的值?printf(%d,*p); 等價于printf(%d,n);*指針變量名“*”為指針運算符,表示指針變量
5、所指向內(nèi)存單元的內(nèi)容。 引用時的“*”不同于指針變量定義語句中的“*”。int *p; “*”是指針標志符printf(%d,*p); “*”是指針運算符【格式】【說明】1地址與指針指針變量的基本使用示例通過指針變量訪問的方式計算兩個整數(shù)之和。#include stdio.hvoid main() int a,b,s; int *pa,*pb; pa=&a; pb=&b; scanf(%d %d,pa,pb); s=*pa+*pb; printf(s=%dn,s);/定義兩個整型指針變量pa、pb/使pa指向a/使pb指向b/為pa,pb所指向的內(nèi)存單元輸入值(10、20)/通過指針變量訪問的
6、方式求和(30)/輸出求和結(jié)果/定義整型變量a、b代表兩個加數(shù),整型變量s存求和結(jié)果&apaa&bpbbs102030輸入:10 20301地址與指針指針變量的基本使用示例利用自定義函數(shù)add( )計算兩個整數(shù)之和。#include stdio.hint add(int *pa,int *pb) int sum; sum=*pa+*pb; return sum;void main() int a,b,s; scanf(%d %d,&a,&b); s=add(&a,&b); printf(s=%dn,s);/輸入a、b的值(10、20)/求和結(jié)果通過return語句返回主函數(shù)/add( )是自定
7、義函數(shù),形參pa、pb是指針變量/調(diào)用add函數(shù),將&apa、&bpb/形參pa a,形參pb b,實現(xiàn)兩個整數(shù)求和/輸出求和結(jié)果&apaa&bpbbs102030&a&bsum30輸入:10 20301地址與指針指針變量的基本使用隨堂練習#include void add(int *pa,int *pb,int *psum) *psum=*pa+*pb;void main() int a,b,s; scanf(%d%d,&a,&b); add(&a,&b,&s); printf(s=%dn,s);試分析如下程序,看看是否能實現(xiàn)“利用自定義函數(shù)計算兩個整數(shù)的和”?目錄1地址與指針3用指針操作二
8、維數(shù)組4用字符指針操作字符串5返回地址的函數(shù)2用指針操作一維數(shù)組 用指針操作一維數(shù)組2用指針操作一維數(shù)組p=a;int a5;int *p;/建立數(shù)組a與指針p之間的關(guān)系等價于 p=&a0;如何建立數(shù)組a與指針p之間的關(guān)系?p p+1 a+1p+2 a+2p+3 a+3p+4 a+4a1a0a2a3a4 a數(shù)組 a內(nèi)存單元2用指針操作一維數(shù)組p a+1a1a0a2a3a4 a數(shù)組 a內(nèi)存單元若有如下定義:int a5,*p;p=a;a+1是a1的地址,a+i就是ai的地址。a+i關(guān)于地址: a+i&(ai) p+i*(p+i)關(guān)于元素: ai*(a+i) 等價關(guān)系如下:2用指針操作一維數(shù)組示例
9、利用兩種方法,輸出一維數(shù)組各元素地址。#include stdio.hvoid main() int a5,*p,i; p=a; printf(獲取數(shù)組元素地址:n); for(i=0;i5;i+) printf(&a%d=%pn,i, &ai ); printf(利用指針表示數(shù)組元素地址:n); for(i=0;i5;i+) printf(p+%d=%pn,i, p+i );獲取數(shù)組元素地址:利用指針表示數(shù)組元素地址:&a0=0018FF34&a3=0018FF40&a4=0018FF44&a1=0018FF38&a2=0018FF3Cp+0=0018FF34p+1=0018FF38p+2=
10、0018FF3Cp+3=0018FF40p+4=0018FF442用指針操作一維數(shù)組示例輸出一維數(shù)組各元素的值。#include stdio.hvoid main() int a5=10,31,52,3,68,*p,i; p=a; printf(輸出數(shù)組元素的值(下標法):n); for(i=0;i5;i+)printf(a%d=%dn,i, ai ); printf(輸出數(shù)組元素的值(下標法):n); for(i=0;i5;i+)printf(p%d=%dn,i, pi ); printf(輸出數(shù)組元素的值(指針法):n); for(i=0;i5;i+)printf(*(p+%d)=%dn,
11、i, *(p+i) );輸出數(shù)組元素的值(下標法):輸出數(shù)組元素的值(下標法):a0=10a3=3a4=68a1=31a2=52*(p+4)=68p0=10p3=3p4=68p1=31p2=52輸出數(shù)組元素的值(下標法):*(p+1)=31*(p+0)=10*(p+2)=52*(p+3)=32用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù) 利用函數(shù)處理批量數(shù)據(jù)時,若實參是數(shù)組,形參可是數(shù)組也可是指針,實參、形參之間傳遞的是地址。#include stdio.hint sum(int p ,int n) int i,t=0; for(i=0;in;i+) t+=pi; return t;void main(
12、 ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(數(shù)組元素之和為:%d.n,s);形參 ( p n )實參 ( a 5 )數(shù)組元素之和為:10.用函數(shù)計算整型數(shù)組各元素之和。2用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù)#include stdio.hint sum(int *p,int n) int i,t=0; for(i=0;in;i+) t+=*(p+i); return t;void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(數(shù)組元素之和為:%d.n,s);數(shù)組元素之和為:10.指針表示地址,它可作函數(shù)的參數(shù)
13、。參數(shù)傳遞后指針指向數(shù)組的首地址。01234p aa1a0a2a3a4參數(shù)傳遞過程:用指針作形參,計算整型數(shù)組各元素之和。2用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù) 數(shù)組名作實參,對應(yīng)的形參可是數(shù)組也可是指針,形參、實參的數(shù)據(jù)類型應(yīng)一致。#include stdio.hint sum(int p ,int n) void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); #include stdio.hint sum(int *p,int n) void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); 形參是數(shù)組形參是指針數(shù)組名作實參數(shù)組
14、名作實參【說明】2用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù) 進行函數(shù)調(diào)用時,將數(shù)組的首地址傳給形參,形參的改變對實參產(chǎn)生影響。 實參與形參共同占用一段內(nèi)存,在函數(shù)執(zhí)行過程中形參元素值發(fā)生變化,實參元素值也會隨之改變。#include stdio.hint sum(int *p,int n) *(p+2)=10; void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(數(shù)組元素之和為:%d.n,s); printf(“a2=%dn”,a2);a0a1a2a3a4p a相當于:p=a; 24310for(i=0;in;i+) t+=*(p+i); retu
15、rn t;10數(shù)組元素之和為:18.a2=10數(shù)組元素求和并返回【說明】目錄1地址與指針2用指針操作一維數(shù)組4用字符指針操作字符串5返回地址的函數(shù)3用指針操作二維數(shù)組 用指針操作二維數(shù)組3用指針操作二維數(shù)組二維數(shù)組中所蘊含的地址關(guān)系int a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a0a1a2a3 a數(shù)組a由4個元素組成: a0、a1、a2 、a3a0包含有 3 個元素:a00、a01、a02,a0a00a01a02a10a11a12a20a21a22a1a2210543876a30a31a32a3910113用指針操作二維數(shù)組二維數(shù)組中所蘊含的地址關(guān)系 a a+1 a
16、+2a代表二維數(shù)組的首地址,也是二維數(shù)組第0行的首地址。a+1代表第1行的首地址, 。由于第0行有3個整型元素, 所以第1行的首地址為1012, 。 1000 1012 1024設(shè)此二維數(shù)組的首地址為1000。int a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a00a01a02a10a11a12a20a21a22210543876a30a31a3291011 a+3 10361個整型變量占4個字節(jié)3用指針操作二維數(shù)組二維數(shù)組中所蘊含的地址關(guān)系得出 a0 a1 a2 a0、a1、a2 、a3分別代表二維數(shù)組各行的首地址 a0代表第0行中第0列元素的地址 &a00; a0+
17、1即代表第0行第1列元素的地址 &a01;ai+j即代表第i行第j列元素的地址,即&aijint a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a00a01a02a10a11a12a20a21a22210543876a30a31a3291011 a3【說明】3用指針操作二維數(shù)組二維數(shù)組中所蘊含的地址關(guān)系二維數(shù)組元素aij可表示成 可用指針形式表示各元素的地址。a0等價于*(a+0) ,a1等價于*(a+1)。得出ai+j等價于*(a+i)+j,即代表第i行第j列元素的地址a00a01a02a10a11a12a20a21a22210543876a30a31a3291011in
18、t a43=0,1,2, 3,4,5, 6,7,8, 9,10,11; a0 a1 a2 a3*(ai+j)、*(*(a+i)+j)、(*(a+i)j 【說明】3用指針操作二維數(shù)組二維數(shù)組中所蘊含的地址關(guān)系 &aij ai+j *(a+i)+j二維數(shù)組元素aij的地址表示方式有:a0a1a2a3a00a01a02a10a11a12a20a21a22a30a31a32 aint a43; aij *(ai+j) *(*(a+i)+j) (*(a+i)j二維數(shù)組元素aij的表示方式有:3用指針操作二維數(shù)組建立指針與二維數(shù)組的關(guān)系 數(shù)組中的每個元素都是指針變量,根據(jù)數(shù)組的定義,指針數(shù)組中每個元素都為
19、指向同一數(shù)據(jù)類型的指針。指針數(shù)組,就是用指向同一數(shù)據(jù)類型的指針來構(gòu)成一個數(shù)組。int *p3,i; /定義指針數(shù)組p,包含3個指針變量p0,p1,p2int a34=12,3,5,61,60,54,13,8,71,9,19,24;for( i=0; i3;i+) pi=ai;建立指針數(shù)組與二維數(shù)組之間的關(guān)系【示例】3用指針操作二維數(shù)組建立指針與二維數(shù)組的關(guān)系12356160541387191924a0a1a2 a00 a01 a02 a03a10 a11 a12 a13 a20 a21 a22 a23p0 p1 p2pint *p3,i; int a34=12,3,5,61,60,54,13,
20、8,71,9,19,24;for( i=0; i3;i+) pi=ai;3用指針操作二維數(shù)組建立指針與二維數(shù)組的關(guān)系int *p3,i; int a34=12,3,5,61,60,54,13,8,71,9,19,24;for( i=0; i*y) return x; else return y; void main() int *p,i,j; printf(請輸入兩個整數(shù):); scanf(%d %d,&i,&j); p=f(&i,&j); printf(第一個數(shù)為%d,存儲地址為:%p.n,i,&i); printf(第二個數(shù)為%d,存儲地址為:%p.n,j,&j); printf(較大的數(shù)為%d,存儲地址為:%p.n,*p,p);/函數(shù)返回值是指針類型/返回變量x的地址/接收返回值的變量p是指針類型請輸入兩個整 數(shù):50 10第一個數(shù)為50,存儲地址為:0018FF40第一個數(shù)為10,存儲地址為:0018FF3C較
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度工傷人員傷殘評定及賠償協(xié)議
- 2025年度集體合同協(xié)商中的勞動爭議處理
- 2025年度幼兒園保安聘用合同標準范本
- 二零二五年度專業(yè)護工針對心血管疾病病人護理合同
- 2025年度中小企業(yè)發(fā)展基金借款連帶擔保人合同
- 2025年度單位食堂承包及員工滿意度提升協(xié)議
- 2025年度知識產(chǎn)權(quán)股份代持許可使用協(xié)議
- 2025年度國際文化交流項目合作誠意金協(xié)議
- 2025年度工程監(jiān)理個人勞動合同(工程質(zhì)量安全管理)
- 2025年度航空航天器復合材料維修合同
- 簡單的路線圖(說課稿)2024-2025學年三年級上冊數(shù)學西師大版
- 成都市2024-2025學年度上期期末高一期末語文試卷(含答案)
- 2025年教育局財務(wù)工作計劃
- Unit 5 Now and Then-Lesson 3 First-Time Experiences 說課稿 2024-2025學年北師大版(2024)七年級英語下冊
- 《中國心力衰竭診斷和治療指南2024》解讀
- 中小學智慧校園建設(shè)方案
- 中國食物成分表2020年權(quán)威完整改進版
- 【MOOC】影視鑒賞-揚州大學 中國大學慕課MOOC答案
- 危險性較大的分部分項工程清單安全管理措施
- 高壓輸電線路質(zhì)量、檢查、驗收培訓課件
- 混合型頸椎病課件
評論
0/150
提交評論