版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計(jì)
目
錄目錄CONTENTS
指針的概念8.1
指針變量8.2
8.1指針的概念
核心概念定義
一個(gè)變量的地址稱為該變量的“指針”。如果有一個(gè)變量專門用來存放其他變量的地址(指針),這個(gè)變量被稱為“指針變量”。
變量地址:以整型變量為例,若其占據(jù)4個(gè)字節(jié),這4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址,即為該整型變量的地址,也稱為其“首地址”。
指針:變量的地址就叫做該變量的“指針”。例如整型變量a的地址,可直接記作&a,&a就是變量a的指針。
指針變量:專門用于存放其他變量地址(即指針)的變量,被稱為“指針變量”。
實(shí)例說明
以整型變量inta=247為例,具體解釋上述概念:1.變量a在內(nèi)存中占據(jù)4個(gè)連續(xù)字節(jié),用于存儲(chǔ)數(shù)值247。2.假設(shè)這4個(gè)字節(jié)的起始地址(首地址)為0012FF7C,那么變量a的地址就是0012FF7C。3.這個(gè)地址0012FF7C既是變量a的首地址,也是變量a的指針,按規(guī)定寫法記為&a。訪問變量的方式可分為兩種,一種是“直接訪問”方式,另一種是“間接訪問”方式。按變量名訪問的方式稱為“直接訪問”方式。例如,圖所示即為直接訪問方式,通過變量名a直接賦值,由于變量名與變量的地址一一對應(yīng),因此,直接將數(shù)值1放到變量a的存儲(chǔ)單元中。
8.1指針的概念如果將變量a的地址存放在另一變量中,然后通過該變量來找到變量a的地址,從而訪問變量a,這就是“間接訪問”方式。例如,圖所示即為間接訪問方式,先找到存放變量a地址的變量p,從其中得到變量a的地址(2000),從而找到變量a的存儲(chǔ)單元,然后對它進(jìn)行存取訪問。這就好比要取抽屜a中的東西,需要先用抽屜p的鑰匙打開抽屜p,從抽屜p中取出抽屜a的鑰匙,再打開抽屜a。
提示一個(gè)變量的地址稱為該變量的“指針”。例如,地址2000是變量a的指針。專門用來存放另一變量地址(即指針)的變量稱為“指針變量”。例如,上述變量p就是一個(gè)指針變量?!爸羔槨笔且粋€(gè)地址,而“指針變量”是存放地址的變量。注意區(qū)分兩者的概念。
8.1指針的概念指針變量與一般變量一樣,必須“先定義后使用”。定義一個(gè)指針變量需要解決兩個(gè)問題:一是說明指針變量的名字,二是說明指針變量指向變量的數(shù)據(jù)類型。定義指針變量的一般形式為:類型說明符*指針變量名1,*指針變量名2…;例如:int*p1; /*定義指向整型變量的指針變量p1*/char*p2,*p3; /*定義指向字符型變量的指針變量p2和p3*/其他類型的變量允許和指針變量在同一個(gè)語句中定義,例如:intm,*p; /*定義2個(gè)變量,其中m是整型變量,p是指向整型變量的指針變量*/
8.2指針變量8.2.1指針變量定義
提示1)在定義時(shí),指針變量名前的“*”表示該變量的類型是指針型變量,不能省略。(2)指針變量定義中的“數(shù)據(jù)類型”是指針指向的目標(biāo)數(shù)據(jù)的類型。讀者可能會(huì)提出,既然指針變量是存放地址的,那么為什么要指定數(shù)據(jù)類型呢?我們知道,不同類型的數(shù)據(jù)在內(nèi)存中所占的字節(jié)數(shù)和存放方式是不一樣的。例如,字符型數(shù)據(jù)占1個(gè)字節(jié),整型數(shù)據(jù)占4個(gè)字節(jié)。因此,如果想通過指針引用一個(gè)變量,只知道地址(如2000)是不夠的,因?yàn)闊o法判斷是從地址為2000的一個(gè)字節(jié)中取出字符型數(shù)據(jù),還是從2000到2003四個(gè)字節(jié)中取出整型數(shù)據(jù)。
8.2指針變量8.2.1指針變量定義可以在定義指針變量的同時(shí)為其賦初值,即指針變量的初始化。由于指針變量是指針類型,因此,所賦初值應(yīng)是一個(gè)地址值。其一般格式為:類型說明符*指針變量名1=地址1,*指針變量名2=地址2…;例如:inti;int*p=&i; /*定義指針變量p指向整型變量i*/表示地址的形式可以是“&變量名”“數(shù)組名”“其他指針變量”等。例如:chars[20];char*str=s; /*定義指針變量str指向字符數(shù)組s的首地址*/
8.2指針變量8.2.2
指針變量初始化在引用指針變量時(shí),一般有3種情況。給指針變量賦值1在程序執(zhí)行過程中,可以使用賦值語句為指針變量賦值,一般格式為:指針變量=地址;例如:inta=20,b=30,*p1,*p2;p1=&a; /*把變量a的地址賦給指針變量p1*/p2=&b; /*把變量b的地址賦給指針變量p2*/
8.2指針變量8.2.3
指針變量引用定義了兩個(gè)整型變量a和b,a初值為20,b初值為30;定義了指針變量p1指向變量a,指針變量p2指向變量b,其相互之間的關(guān)系如左圖所示。指針變量和一般變量一樣,存放在它們之中的值是可以改變的,也就是說,可以改變它們的指向,例如,執(zhí)行表達(dá)式語句“p2=p1;”,意思是p2與p1指向同一對象a,此時(shí)*p2就等價(jià)于a,而不是b,如右圖所示。
8.2指針變量8.2.3
指針變量引用
名師點(diǎn)睛要熟練掌握兩個(gè)有關(guān)的運(yùn)算符:(1)“&”運(yùn)算符是取地址運(yùn)算符,它是單目運(yùn)算符,其功能是返回其后所跟操作數(shù)的地址,其結(jié)合性為從右向左。例如,&a是變量a的地址。(2)“*”運(yùn)算符是指針運(yùn)算符,也稱間接運(yùn)算符,它也是單目運(yùn)算符。其功能是取該指針指向的存儲(chǔ)單元的值。例如,*p代表指針變量p指向的對象。
8.2指針變量8.2.3
指針變量引用引用指針變量指向的變量2如果在上述定義語句后面執(zhí)行表達(dá)式語句“*p2=*p1;”,即:inta=20,b=30,*p1,*p2;p1=&a; /*把變量a的地址賦給指針變量p1*/p2=&b; /*把變量b的地址賦給指針變量p2*/*p2=*p1; /*引用指針變量指向的變量*/則表示把p1指向的內(nèi)容賦給p2所指的區(qū)域,即等價(jià)于“b=a;”,如圖所示。
8.2指針變量8.2.3
指針變量引用【例8-1】有下列代碼,試分析輸出結(jié)果。#include<stdio.h>intmain(){ intx=10,*p,y; p=&x; /*取變量x的地址賦給指針變量p*/ y=*p; /*將*p的值賦給y*/ printf("x=%d,*p=%d,y=%d\n",x,*p,y); /*輸出x,*p和y的值*/ printf("&x=%x,p=%x,&y=%x\n",&x,p,&y); /*輸出x和y的地址以及指針p的值*/ return0;}引用指針變量的值3用十六進(jìn)制形式輸出指針變量p的值,即輸出a的地址,可以用如下語句實(shí)現(xiàn)。inta;int*p=&a;printf("%x",p);
8.2指針變量8.2.3
指針變量引用【程序說明】此例中定義了三個(gè)變量,x和y為整型變量,p為指針變量。x的初值為10,讓p去指向x,*p表示取指針變量p所指存儲(chǔ)單元的內(nèi)容,即變量x的值,因此,*p和y也等于10。p為指針變量且指向x,因此,p即為x的地址;y和x是不同的變量,因此,它們所占的存儲(chǔ)空間不同,即地址不同。
8.2指針變量8.2.3
指針變量引用【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖所示。
提示此例中第4行和第6行都出現(xiàn)了“*p”,但意義是不同的。“intx=10,*p,y;”語句中的“*p”表示將變量p聲明為指針變量,用“*”以區(qū)別于一般變量。而“y=*p;”中的“*p”表示使用指針變量p,此時(shí)“*”是運(yùn)算符,表示取指針?biāo)赶虻拇鎯?chǔ)單元內(nèi)容,即對p進(jìn)行間接存取運(yùn)算,取變量x的值。
8.2指針變量8.2.3
指針變量引用空指針1不指向任何對象的指針即為空指針,表示該指針沒有指向任何內(nèi)存單元。構(gòu)造空指針有下面兩種方法。(1)賦0值。例如:int*p=0;
名師點(diǎn)睛除0之外,一般不把其他整數(shù)作為初值賦給指針變量。程序運(yùn)行期間,變量的地址是由計(jì)算機(jī)分配的,當(dāng)用一個(gè)整數(shù)為一個(gè)指針變量賦初值后,可能會(huì)造成難以預(yù)料的后果。
8.2指針變量8.2.4
空指針與void指針(2)賦NULL值,NULL的值等于0,兩者等價(jià)。例如:int*p=NULL;空指針常用來初始化指針,避免野指針的出現(xiàn)。對指針變量賦0值和不賦值是不同的。指針變量未賦值時(shí),可以是任意值,是不能使用的,否則將造成意外錯(cuò)誤。而指針變量賦0值后,則可以使用,只是它不指向具體的變量。void指針2C語言規(guī)定,指針變量也可以定義為void型,例如:void*p;這里p仍然是一個(gè)指針變量,有自己的內(nèi)存空間。但是不指定p指向哪種類型的變量。在這種情況下,應(yīng)該注意:
8.2指針變量8.2.4
空指針與void指針(1)任何指針都可以賦值給void指針。例如:intx=10;int*q=&x;p=q; /*不需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換*/(2)使用void指針時(shí)必須對其進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將void指針轉(zhuǎn)換成它所指向單元的實(shí)際類型,然后才可以使用。因此,void指針賦值給其他類型的指針時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。例如:int*t=(int*)p; /*需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換*/printf("*p=%d",*(int*)p); /*輸出p指向的存儲(chǔ)單元內(nèi)容*/指針是內(nèi)存單元的地址,指
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年下半年大慶市紅崗區(qū)機(jī)關(guān)事業(yè)單位人才引進(jìn)10人備考題庫附答案
- 2025廣東佛山市南海區(qū)委黨校選調(diào)5名事業(yè)編制人員備考題庫附答案
- 2025年11月四川省西南醫(yī)科大學(xué)招聘專職輔導(dǎo)員15人(公共基礎(chǔ)知識(shí))綜合能力測試題附答案
- 2025廣東東莞濱海灣新區(qū)管理委員會(huì)招聘編外聘用人員23人(公共基礎(chǔ)知識(shí))測試題附答案
- AI賦能手術(shù)機(jī)器人:臨床應(yīng)用與價(jià)值分析
- 2026黑龍江佳木斯市樺川縣人民法院招聘聘用制輔警1人筆試備考題庫及答案解析
- 2026湖南長沙市長郡中學(xué)引進(jìn)競賽教練5人筆試參考題庫及答案解析
- 2026吉林延邊州就業(yè)服務(wù)局招聘公益性崗位2人筆試備考試題及答案解析
- 2026年安徽中醫(yī)藥大學(xué)第一附屬醫(yī)院部分骨干人員招聘2名筆試備考題庫及答案解析
- 2026湖北省面向西安交通大學(xué)普通選調(diào)生招錄筆試備考題庫及答案解析
- 《糖尿病合并高血壓患者管理指南(2025版)》解讀
- 職業(yè)暴露考試試題及答案
- DB61-T 1843-2024 酸棗種植技術(shù)規(guī)范
- 機(jī)械密封安裝及維護(hù)培訓(xùn)
- 古建筑修繕加固施工方案
- DG-TJ08-19-2023園林綠化養(yǎng)護(hù)標(biāo)準(zhǔn)
- 上海市2024-2025學(xué)年高二上學(xué)期期末考試英語試題(含答案無聽力原文及音頻)
- 實(shí)驗(yàn)室評審不符合項(xiàng)原因及整改機(jī)制分析
- 農(nóng)貿(mào)市場攤位布局措施
- 一列腸ESD個(gè)案護(hù)理
- 污水泵站自動(dòng)化控制方案
評論
0/150
提交評論