




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、122.2.數據在內存中的存儲方式數據在內存中的存儲方式: : 按數據類型在內存為其分配一定數量的按數據類型在內存為其分配一定數量的存儲單元存儲單元( (字節(jié)字節(jié)) )。1.1.內存單元的地址內存單元的地址: : 計算機的內存是以字節(jié)為單位的一片連續(xù)的計算機的內存是以字節(jié)為單位的一片連續(xù)的存儲空間,每一個字節(jié)都有一個編號,這個存儲空間,每一個字節(jié)都有一個編號,這個編號就稱為內存地址編號就稱為內存地址3.3.內存單元的內容:內存單元的內容: 即變量的值。即變量的值。3例如有定義例如有定義: short int a,b; char c; float x; 變量變量a,b,c,x的內存分配的內存分配
2、情況情況:abxc200020012002200320042005200620072008 每個變量的地址是指該變量所占存儲單元的每個變量的地址是指該變量所占存儲單元的第一個字節(jié)的地址,稱為指針。第一個字節(jié)的地址,稱為指針。44. 4. 計算機中數據存取方式計算機中數據存取方式A A、變量的、變量的“直接訪問直接訪問”方式:方式: 按變量的地址存取變量值的方式。按變量的地址存取變量值的方式。( (見下圖見下圖) )i20003直接訪問直接訪問: :編譯器自動完成編譯器自動完成53i20002000pointer間接訪問方式示意圖間接訪問方式示意圖: 將將變量的地址變量的地址放在另一個特殊的變量
3、中,先到另放在另一個特殊的變量中,先到另一個變量所表示的存儲單元中取得變量的地址,再由一個變量所表示的存儲單元中取得變量的地址,再由變量的地址找到變量并進行數據存取變量的地址找到變量并進行數據存取( (見下圖見下圖) )。b.b.變量的變量的“間接訪問間接訪問”方式方式變量變量pointer為指針變量為指針變量, ,存放的是變量存放的是變量i i的的內存地址內存地址, ,我們說我們說pointer指向指向 i i。66.指針的概念:指針的概念:一個變量的首地址稱為該變量的指針。一個變量的首地址稱為該變量的指針。用來專門存儲用來專門存儲變量指針變量指針的變量稱為指針變量。的變量稱為指針變量。7一
4、一. . 指針變量的定義指針變量的定義1. 定義方式:定義方式: 類型標識符類型標識符 *指針變量名指針變量名1,*指針變量名指針變量名2 ;例:例:float *p1; (定義了定義了p1為指向實型變量的指針變量為指向實型變量的指針變量) char *p2; (定義了定義了p2為指向字符型變量的指針變量為指向字符型變量的指針變量) 8 標識符前面的標識符前面的“* *”,表示該變量為指針,表示該變量為指針 變量。但指針變量名是變量。但指針變量名是* *后面的名字(不包后面的名字(不包括括“* *”)。)。3.3.說明說明2. 指針變量的指針變量的三三要素要素:v指針變量的指針變量的基類型基類
5、型: 和其所指變量的類型一致;和其所指變量的類型一致;v指針變量的指針變量的值值:另一個變量在內存的地址;另一個變量在內存的地址;v指針變量的指針變量的名字名字:符合用戶標識符規(guī)則。符合用戶標識符規(guī)則。 9指針變量名指針變量名=某一地址某一地址;.指針變量的賦值指針變量的賦值方式方式1: 指針變量名指針變量名=&變量名變量名;方式方式2: 指針變量名指針變量名=另一已經賦值的指針變量另一已經賦值的指針變量;方式方式3: 通過標準的庫函數(通過標準的庫函數(malloc和和calloc在內存中開辟動態(tài)存儲在內存中開辟動態(tài)存儲單元)單元)10i的地址的地址pi的值的值iqi的
6、地址的地址例如例如: int i,*p,*q; p=&i; /*方式方式1*/ q=p; /*方式方式2*/示示意意圖圖11說明:給指針變量賦說明:給指針變量賦“空空”值值除了給指針變量賦地址值外,還可以給指針變量賦除了給指針變量賦地址值外,還可以給指針變量賦NULLNULL值。值。如:如:p=Nullp=Null;NullNull是在是在stdio.hstdio.h頭文件中定義的預定義符。在使用前必須頭文件中定義的預定義符。在使用前必須使用預定義行:使用預定義行:#include #include 。NullNull的代碼值為的代碼值為0 0,當執(zhí)行以上賦值語句后,稱當執(zhí)行以上賦值語
7、句后,稱p p為空指針。等價于:為空指針。等價于:p=0 ; p=0 ; 或或 p=0p=0注意:這時指針注意:這時指針p p不是指向地址為不是指向地址為0 0的存儲單元,而是一個的存儲單元,而是一個具有一個確定的值具有一個確定的值“空空”。企圖通過一個空指針去訪問一。企圖通過一個空指針去訪問一個存儲單元,將會得到一個出錯信息。個存儲單元,將會得到一個出錯信息。121. 1.已知已知 int a=3, aint a=3, a的地址為的地址為10011001,則,則&a= &a= ?100110012. 2.設有定義:設有定義:float x; float x; 則以下對指針變量
8、則以下對指針變量p p進行定義且賦初值的語進行定義且賦初值的語句中正確的是:句中正確的是:a) float a) float * *p=1024; b) int p=1024; b) int * *p=(float)x; c) float p=&x d) float p=(float)x; c) float p=&x d) float * *p=&xp=&xD D134. 4.有以下程序段有以下程序段#include #include main()main() int n, int n,* *p=NULL;p=NULL; * *p=&n;p=&n
9、; scanf(“%d”,&p); scanf(“%d”,&p); printf(“%dn”,p); printf(“%dn”,p); 該程序試圖通過該程序試圖通過P P為變量為變量n n讀入數據并輸出,但程序有多出錯誤,讀入數據并輸出,但程序有多出錯誤,以下語句正確的是:以下語句正確的是: n, n,* *p=NULL b.p=NULL b.* *p=&n p=&n c.scanf(“%d”,&p) d.printf(“%dn”,p);c.scanf(“%d”,&p) d.printf(“%dn”,p);A A148.4.8
10、.4.對指針變量的操作對指針變量的操作1. 1.通過指針來引用一個存儲單元通過指針來引用一個存儲單元 C C語言提供了一個稱作語言提供了一個稱作“間接訪問運算符間接訪問運算符”( (間接運算符)的單目間接運算符)的單目運算符:運算符:“* *”,當指針變量有確切的地址值時,就可以通過間接,當指針變量有確切的地址值時,就可以通過間接訪問運算符引用該地址指向的存儲單元。訪問運算符引用該地址指向的存儲單元。如:如: int int * *p,i=10,j;p,i=10,j; p=&i; p=&i; j= j=* *p; p; 說明:把說明:把p p所指向的存儲單元(所指向的存儲單元(
11、i i)的值賦給)的值賦給j j,* *p p代表代表p p所指向的所指向的變量變量i i,以上語句等價于:,以上語句等價于: j=ij=i;15分析以下表達式的含義:分析以下表達式的含義:j=j=* *(&i); j=(&i); j=* *p+1;p+1;* *p=100; p=100; * *p+=1;p+=1;+* *p; (p; (* *p)+;p)+; int int * *p,i=10,j;p,i=10,j; p=&i; p=&i; j= j=* *p; p; 例子:例例子:例8.18.1162.算術運算算術運算(移動指針)移動指針) 例如例如: i
12、nt *p,i; char *q , c; p=&i;q=&c;.i10001001100220002001cpq.i10001001100220002001cpq / /* *運算示例運算示例* */ / p+;q+; 對指針進行加減運算時,數字對指針進行加減運算時,數字“1”1”不代表十進制整數不代表十進制整數“1”1”,即不是移動一個字節(jié),而是移動一個存儲單元長度。即不是移動一個字節(jié),而是移動一個存儲單元長度。17例如例如:右圖右圖1 pq為為假。假。.i10001001100220002001cpq.400040014002400340184019pqa0a1a9例如例
13、如:右圖右圖2int a10;int *p,*q;p=&a0; /*或或p=a;*/q=&a9;/*或或q=a+9;*/求求pq為真為假為真為假?2.比較運算比較運算18例例 main()int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b; printf (%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);程序運行結果:程序運行結果: 100,10 100,1019思考:思考:1.若已執(zhí)行了若已執(zhí)行了“pointer_1=&a
14、mp;a”,則:則: “&*pointer_1”的含意是什么?的含意是什么? (答:相當于答:相當于&a )2. *&a的含意是什么的含意是什么? (答:答:a )3. (*pointer_1)+相當于什么相當于什么? (答:答:a+ )20例例對輸入的兩個整數按大小順序輸出對輸入的兩個整數按大小順序輸出main()int *p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=&b;&a59p1p2&bab(1 初始初始)2 執(zhí)行執(zhí)行p=p1后后&a5p1a&b9p2b&apif (ab) p=p1;p1
15、=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);&b&b3 執(zhí)行執(zhí)行p2=p1后后&ap9p1p25ab4 執(zhí)行執(zhí)行p2=p后后5&a&b&a9pp1p2ab21-指向指針變量的指針指向指針變量的指針.定義形式定義形式: 類型類型 *變量名變量名;例如例如: int i,*p,*q; i=30; p=&i; q=&p;100020001000100120003000ipq 內存示意圖內存示意圖:指針的指針指針的指針22國家等級考試練習:國家等級考試
16、練習:1. 1.設有定義:設有定義:int n1=0,n2,int n1=0,n2,* *p=&n2,p=&n2,* *q=&n1,q=&n1,以下賦值語句中與以下賦值語句中與n2=n1;n2=n1;語句等價的是:語句等價的是:a. a. * *p=p=* *q; b.p=q c.q; b.p=q c.* *p=&n1 d. p=p=&n1 d. p=* *q qA A2. 2.若有說明語句:若有說明語句:double double * *p,a;p,a;則能通過則能通過scanfscanf語句正確給輸入語句正確給輸入項讀入數據的程序段是:項讀入
17、數據的程序段是:a. a.* *p=&a;scanf(“%lf”,p); b.p=&a;scanf(“%lf”,p); b.* *p=&a; scanf(“%f”,p);p=&a; scanf(“%f”,p);c.p=&a;scanf(“%lf”,c.p=&a;scanf(“%lf”,* *p); d.p=&a;scanf(“%lf”,p);p); d.p=&a;scanf(“%lf”,p);D D3. 3.已定義以下函數已定義以下函數int fun(int int fun(int * *p)p)return return * *
18、p;p;funfun函數的返回值是:函數的返回值是:a. a.不確定的值不確定的值 b. b.一個整數一個整數 c. c.形參形參p p中存放的值中存放的值 d. d.形參形參p p的地址值的地址值 B B231. 1.形參為指針變量時實參和形參之間的數據傳遞形參為指針變量時實參和形參之間的數據傳遞 若函數的形參為指針類型,調用該函數時,對應的實參必須是若函數的形參為指針類型,調用該函數時,對應的實參必須是基類型相同的地址值或者是已指向某個存儲單元的指針變量。基類型相同的地址值或者是已指向某個存儲單元的指針變量。例例. .編寫函數編寫函數myadd(int myadd(int * *a,int
19、 a,int * *b),b),函數中把指針函數中把指針a a和和b b所指向的存儲所指向的存儲單元中兩個值相加,然后將和的值作為函數值返回。單元中兩個值相加,然后將和的值作為函數值返回。#include #include int myadd( int int myadd( int * *a,int a,int * *b)b) int sum; int sum; sum= sum=* *a+a+* *b; b; return sum; return sum; main()main() int x,y,z; int x,y,z; printf(“enter x,y:”); printf(“ent
20、er x,y:”);scanf(“%d%d”,&x,&y);scanf(“%d%d”,&x,&y);z=myadd(&x,&y);z=myadd(&x,&y);printf(“%d+%d=%dn”,x,y,z);printf(“%d+%d=%dn”,x,y,z); 思考:如果在被調函數中改變形參的值將如何呢?思考:如果在被調函數中改變形參的值將如何呢?242. 2.通過傳送地址值在被調用函數中直接改變調用函數中變量的值通過傳送地址值在被調用函數中直接改變調用函數中變量的值#include “stdio.h”#include “st
21、dio.h”Void s Void s * *,int ,int * *); );Void main()Void main() int x=30,y=20; int x=30,y=20; printf(“(1) x=%d y=%dn”,x,y); printf(“(1) x=%d y=%dn”,x,y); S); S); printf(“(4) x=%d y=%dn”,x,y); printf(“(4) x=%d y=%dn”,x,y); Void s Void s * *a,int a,int * *b)b) int t; int t; printf(“(2) a=%d b=%dn”, pr
22、intf(“(2) a=%d b=%dn”,* *a, a,* *b);b); t= t=* *a; a;* *a=a=* *b; b;* *b=t;b=t; printf(“(3) a=%d b=%dn”, printf(“(3) a=%d b=%dn”,* *a, a,* *b);b); 輸出結果:輸出結果:x=30 y=20 x=30 y=20a=30 b=20a=30 b=20a=20 b=30a=20 b=30(1)(1) (4) x=20 y=30(4) x=20 y=3025void s *x1,int *x2)void order(int *a,int *b)261. 一個函數可以帶回整型值、實型值、字符一個函數可以帶回整型
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 ISO 11901-1:2025 EN Tools for pressing - Gas springs - Part 1: General specifications
- 【正版授權】 ISO 9466:2025 EN Railway applications - Coating of passenger rail vehicles
- 【正版授權】 ISO/IEC 15045-4-2:2024 EN Information technology - Home Electronic System (HES) gateway - Part 4-2: Structure - Simple gateway
- 2025年物流運輸項目融資擔保合同匯編
- 2025年度綠色能源項目融資居間合作協(xié)議范本
- 幼兒園健康教育教學計劃
- 林業(yè)行業(yè)會計個人工作計劃
- 財務信息化建設方案計劃
- 學習成果與展示活動計劃
- 前臺工作中的情緒管理技巧計劃
- 園藝產品的品質講義
- 鋼筋混凝土框架結構工程監(jiān)理的質量控制
- 桃花節(jié)活動方案
- 社區(qū)醫(yī)院建設標準
- 變更戶主情況登記表
- 個人所得稅稅率表【自動提取稅率計算】
- 浙美版小學美術五年級下冊課件1畫家故居
- 中國作家協(xié)會入會申請表
- 電纜橋架重量表
- 水土保持治理效益計算
- 教研活動計劃安排表及教研記錄
評論
0/150
提交評論