版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第8章指針目錄CONTENTS指針與指針變量指針的運(yùn)算指針與數(shù)組8.18.28.38.4指針與字符串指針與函數(shù)8.5
指針與指針變量8.1指針與指針變量指針的概念指針變量的定義指針的概念01內(nèi)存單元
在計(jì)算機(jī)中所有的數(shù)據(jù)都是存放在存儲(chǔ)器中的。一般把存儲(chǔ)器中的一個(gè)字節(jié)稱為一個(gè)內(nèi)存單元。指針
為了方便管理,為每個(gè)內(nèi)存單元編號。根據(jù)內(nèi)存單元的編號就可以找到所需的內(nèi)存單元。內(nèi)存單元編號也叫地址,通常也把這個(gè)地址稱為指針。指針變量
存放指針的變量指針變量的值
某個(gè)內(nèi)存單元的地址單元地址存儲(chǔ)單元00000H00001H00002H00003H00004H00005H…………FFFFEHFFFFFH
指針變量就是專門來存放內(nèi)存地址的變量,它是一種特殊的變量,其特殊之處在于它的變量值是地址,而不是普通的數(shù)據(jù)。
定義指針變量的一般形式:
類型說明符*指針變量名;
其中:
*---表示這是一個(gè)指針類型的變量;
類型說明符---表示本指針變量所指向的變量的數(shù)據(jù)類型,即本指針變量中存放的是什么數(shù)據(jù)類型變量的地址。
指針變量名---為定義的指針變量的名字
例如:
int*p;指針變量的定義02指針的運(yùn)算8.2
有關(guān)指針的兩個(gè)運(yùn)算符指針的運(yùn)算賦值運(yùn)算兩個(gè)指針變量之間的運(yùn)算加減算術(shù)運(yùn)算pb&b31、取地址運(yùn)算符&
取地址運(yùn)算符&是單目運(yùn)算符,其結(jié)合性為自右至左,其功能是取變量的地址,其操作數(shù)必須是變量。其一般形式為:
&變量名;
如:&a表示變量a的地址,&b表示變量b的地址。變量本身必須先定義。
若一指針變量p的值為另一變量a的地址,我們稱該指針變量p指向了變量a。如若有: intb=3,*p; p=&b;
我們稱p指向了b有關(guān)指針的兩個(gè)運(yùn)算符012、取內(nèi)容運(yùn)算符*
單目運(yùn)算符,其結(jié)合性為自右至左,用來表示指針變量所指的變量。在*運(yùn)算符之后的操作數(shù)必須是指針變量或指針常量。如: intb=3,*p;p=&b;
我們稱*p得到的是變量b(或3)。
注意:在指針變量定義中,“*”是類型說明符,表示其后的變量是指針類型。而表達(dá)式中出現(xiàn)的“*”則是一個(gè)運(yùn)算符用以表示指針變量所指的變量賦值運(yùn)算02(1)把一個(gè)變量的地址賦予指向相同數(shù)據(jù)類型的指針變量。
inta,*pa; pa=&a;/*把整型變量a的地址賦予整型指針變量pa*/(2)把一個(gè)指針變量的值賦予指向相同類型變量的另一個(gè)指針變量。
inta,*pa,*pb;pa=&a;pb=pa;/*把a(bǔ)的地址賦予指針變量pb*/(3)把數(shù)組的首地址賦予指向數(shù)組的指針變量。
inta[5],*pa; pa=a;
也可寫為:pa=&a[0];(4)把字符串的首地址賦予指向字符類型的指針變量。 char*pc; pc="clanguage";
或用初始化賦值的方法寫為:
char*pc="cLanguage";指針的算術(shù)運(yùn)算03
對指針變量,可以加上或減去一個(gè)整型量,也可以進(jìn)行自增、自減運(yùn)算。即下面的運(yùn)算是合法的(p是指針變量)。 p+n,p-n,p++,++p,p--,--p(1)p=p+n:表示p向高地址方向移動(dòng)n個(gè)存儲(chǔ)單元(一個(gè)存儲(chǔ)
單元是指指針變量所占的存儲(chǔ)空間)。(2)p=p-n:表示p向低地址方向移動(dòng)n個(gè)存儲(chǔ)單元(一個(gè)存儲(chǔ)單元是指指針變量所占的存儲(chǔ)空間)。(3)p++、++p:
表示當(dāng)前指針p向高地址移動(dòng)1個(gè)存儲(chǔ)單元。其中,p++表示先引用p,再將p向高地址方向移動(dòng)一個(gè)存儲(chǔ)單元,++p表示先移動(dòng)指針再引用p。(4)p--、--p:表示當(dāng)前指針p向低地址移動(dòng)1個(gè)存儲(chǔ)單元。其中,p--表示先引用p,再將p向低地址方向移動(dòng)一個(gè)存儲(chǔ)單元,--p表示先移動(dòng)指針再引用p。
只有指向同一數(shù)組的兩個(gè)指針變量之間才能進(jìn)行運(yùn)算,否則運(yùn)算毫無意義。兩指針變量相減
兩指針變量相減所得之差是兩個(gè)指針?biāo)笖?shù)組元素之間相差的元素個(gè)數(shù)。
如:inta[10],*p=&a[1],*q=&a[5];
則q-p的值為4。注意:兩個(gè)指針變量不能進(jìn)行加法運(yùn)算。兩指針變量進(jìn)行關(guān)系運(yùn)算
指向同一數(shù)組的兩指針變量進(jìn)行關(guān)系運(yùn)算可表示它們所指數(shù)組元素之間的關(guān)系。例如: pf1==pf2表示pf1和pf2指向同一數(shù)組元素 pf1>pf2表示pf1處于高地址位置 pf1<pf2表示pf1處于低地址位置兩個(gè)指針變量之間的運(yùn)算04指針與數(shù)組8.3
指針與數(shù)組二維數(shù)組的指針表示一維數(shù)組的指針表示指針數(shù)組一維數(shù)組的指針表示01
一個(gè)數(shù)組的元素在內(nèi)存中是連續(xù)存放的,數(shù)組第一個(gè)元素的地址稱為數(shù)組的首地址。C語言規(guī)定數(shù)組名是該數(shù)組的首地址。
例如,有如下定義語句:
inta[10],*p;
則語句p=a;和p=&a[0]是等價(jià)的,都表示指針p指向數(shù)組a的首地址。注意:*C語言規(guī)定,數(shù)組首地址即數(shù)組名是一個(gè)地址常量,是不能改變的,a++;是非法的。
由于a+i為a[i]的地址,因此用指針給出數(shù)組元素的地址和內(nèi)容有以下幾種表示形式:
(1)p+i和a+i都表示a[i]的地址,它們都指向a[i]。
(2)*(p+i)和*(a+i)都表示p+i或者a+i所指向?qū)ο蟮膬?nèi)容,即a[i]。
(3)指向數(shù)組元素的指針,也可以表示成數(shù)組的形式,也就是說指針變量也可以帶有下標(biāo),如p[i]與*(p+i)等價(jià)。例8.2:利用指針實(shí)現(xiàn)數(shù)組中的元素輸入和輸出。#include<stdio.h>intmain(){inta[10],*p,i;p=a;printf("請輸入10個(gè)整數(shù):");for(i=0;i<10;i++) scanf("%d",p+i);printf("輸出10個(gè)整數(shù):");for(i=0;i<10;i++) printf("%3d",*(p+i));return0;
}
一維數(shù)組的指針表示01二維數(shù)組的指針表示02二維數(shù)組元素的地址
對于一個(gè)具有n行m列的二維數(shù)組a,可以將a看成是一個(gè)長度為n的一維數(shù)組,數(shù)組中的每一個(gè)元素又是一個(gè)長度為m的一維數(shù)組。
從二維數(shù)組的角度來看,a代表二維數(shù)組的首地址,當(dāng)然也可看成是二維數(shù)組第0行的首地址。a+1就代表第1行的首地址,a+2就代表第2行的首地址。 a[i]是一個(gè)一維數(shù)組名,即a[i]代表第i行的首地址,a[i]+j即代表第i行第j列元素的地址,即&a[i][j]。
可用指針的形式來表示二維數(shù)組各元素的地址。如前所述,a[0]與*(a+0)等價(jià),a[1]與*(a+1)等價(jià),因此a[i]+j就與*(a+i)+j等價(jià),它表示數(shù)組元素a[i][j]的地址。
二維數(shù)組元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j),它們都與a[i][j]等價(jià),或者還可寫成(*(a+i))[j]。即有如下關(guān)系成立。
a+i?a[i]?*(a+i)?&a[i][0] *(*(a+i)+j)=a[i][j]用一級指針引用二維數(shù)組元素
由于二維數(shù)組在存儲(chǔ)時(shí)是線性存儲(chǔ)的,因而可以用一級指針來引用二維數(shù)組的元素。其一般形式為:
設(shè)有如下定義(其中M和N是已經(jīng)定義了的符號常量): inta[M][N],*p=a[0];
則有: p+i*N+j表示了數(shù)組元素a[i][j]的地址;*(p+i*N+j)表示了數(shù)組元素a[i][j]。即有:
p+i*N+j?&a[i][j] *(p+i*N+j)?a[i][j]例8.4:求5階方陣的主對角元素之和。#include<stdio.h> #defineM5 intmain() { inta[M][M],*p,i,j,sum=0; p=a[0]; printf("請輸入方陣的各個(gè)元素:\n"); for(i=0;i<M;i++) for(j=0;j<M;j++) scanf("%d",p+i*M+j); for(i=0;i<M;i++) sum=sum+*(p+i*M+i); printf("主對角元素之和=%d\n",sum); return0; }
用指向由n個(gè)元素構(gòu)成的一維數(shù)組的指針表示二維數(shù)組的元素
指向一個(gè)由n個(gè)元素所組成的數(shù)組指針的定義格式為:
類型說明符(*指針變量名)[大小];此指針也稱為行指針。例如: int(*p)[5];
指針p為指向一個(gè)由5個(gè)元素所組成的整型數(shù)組指針。用行指針表示二維數(shù)組的一般形式為:
設(shè)有如下定義(其中M和N是已經(jīng)定義了的符號常量): inta[M][N],(*p)[N]=a;則有:
p+i?a+i?a[i] *(p+i)+j?&a[i][j] *(*(p+i)+j)?a[i][j]例8.5:用行指針方式求5階方陣的主對角元素之和。#include<stdio.h> #defineM5 intmain() {
inta[M][M],(*p)[M],sum=0; inti,j; p=a; printf("請輸入方陣的各個(gè)元素:\n"); for(i=0;i<M;i++) for(j=0;j<M;j++) scanf("%d",*(p+i)+j); for(i=0;i<M;i++) sum=sum+*(*(p+i)+i); printf("主對角元素之和=%d\n",sum); return0; }
指針數(shù)組03
一個(gè)數(shù)組的若干元素均為指針型數(shù)據(jù)類型,稱為指針數(shù)組。即每個(gè)元素都是指針類型的數(shù)組。
指針數(shù)組的定義形式為:
類型名*數(shù)組名[數(shù)組長度];
例如:int*p[6];
p是數(shù)組名,這個(gè)數(shù)組包括6個(gè)元素,p[0]-p[5],每個(gè)元素都是指向整型數(shù)據(jù)的指針,及p可以用于保存6個(gè)整型數(shù)據(jù)的地址。指針與字符串8.4
對字符串的操作有兩種方法:一種方法是使用字符數(shù)組,另一種是使用字符指針。在字符串處理中,使用字符指針往往比使用字符數(shù)組更方便。
將字符串的指向數(shù)組名賦給一個(gè)字符串指針變量,讓字符串指針變量指向字符串的首地址,這樣就可以通過指向字符串的指針變量操作字符串,例如:
charstr[]="WelcomeToChina“,*p;
p=str;
printf("%s\n",p);
也可以不定義字符數(shù)組,而定義一個(gè)字符指針,用字符指針指向字符串中的字符。例如:
char*p="WelcomeToChina";
printf("%s\n",p);
還可以按以下形式賦值:
char*p;
p="WelcomeToChina";例:利用字符指針變量的方法,完成字符串的復(fù)制。#include<stdio.h>intmain(){charstr1[]="WelcometoWuhan!",str2[80];char*p1,*p2;inti;p1=str1;p2=str2;for(;*p1!='\0';p1++,p2++) *p2=*p1;*p2='\0';printf("str1is%s\n",str1);printf("str2is%s\n",str2);return0;
}
指針與函數(shù)8.5
指針與函組返回指針的函數(shù)指針作函數(shù)參數(shù)指向函數(shù)的指針指針作函數(shù)參數(shù)01指針變量既可以作為函數(shù)的形參,也可以作函數(shù)的實(shí)參。指針變量作參數(shù)時(shí),參數(shù)傳遞是“地址傳遞”,即將實(shí)參(一個(gè)地址)傳遞給被調(diào)用函數(shù)的形參(必須是一個(gè)指針變量)。特點(diǎn):共享內(nèi)存,“雙向”傳遞例:從鍵盤輸入兩個(gè)數(shù),再從大到小輸出#include<stdio.h>voidswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}intmain(){inta,b;int*pa,*pb;scanf("%d,%d",&a,&b);pa=&a;pb=&b;swap(pa,pb);printf("%d,%d\n",a,b);return0;}
例8.11:從鍵盤輸入10個(gè)數(shù),按從小到大的順序輸出。分析:要完成本題,我們需要完成下面4步:s1:輸入10個(gè)數(shù)據(jù);
s2:輸出排序前的數(shù)據(jù);s3:將數(shù)據(jù)進(jìn)行排序;s4:輸出排序后的數(shù)據(jù)。對于每一步我們用一函數(shù)來完成,為此,我們需要編寫3個(gè)函數(shù)分別完成數(shù)據(jù)輸入、數(shù)據(jù)排序、數(shù)據(jù)輸出,再編寫1個(gè)主函數(shù)調(diào)用這3個(gè)函數(shù)完成題目的要求。
一個(gè)函數(shù)可以返回一個(gè)整型值,實(shí)型值等,在有的情況下,我們希望通過函數(shù)返回一個(gè)指針值。返回指針值的函數(shù)稱為返回指針的函數(shù)(或稱指針函數(shù))。定義返回指針的函數(shù)形式為:
類型說明符*函數(shù)名(類型
形參1,類型
形參2,…) {
函數(shù)體 }
函數(shù)名前面的“*”表示該函數(shù)是返回指針的函數(shù),“類型說明符”是函數(shù)返回的指針?biāo)赶虻臄?shù)據(jù)類型。
返回指針的函數(shù)在被調(diào)用的時(shí)候必須注意:調(diào)用該函數(shù)給指針變量賦值,該指針變量的基類型必須與該函數(shù)返回的指針的基類型相同。返回指針的函數(shù)02例8.13:有若干學(xué)生的成績(每個(gè)學(xué)生有5門成績),要求在用戶在輸入學(xué)生序號以后,能輸出該學(xué)生的全部成績(要求用指針函數(shù)來實(shí)現(xiàn))。#include<stdio.h> int*search(int(*pointer)[5],intn) { int*ptr; ptr=*(pointer+n); return(ptr); } intmain() { intscore[][5]={{60,70,80,90,87},{56,89,79,67,88},{34,78,82,90,66}}; int*search(int(*pointer)[5],intn);//函數(shù)聲明
int*p,i,m; printf("請輸入學(xué)生的序號:"); scanf("%d",&m); printf("序號為%d的學(xué)生的成績是:\n",m); p=search(score,m); for(i=0;i<5;i++) printf("%3d\t",*(p+i)); printf("\n"); return0; }
指向函數(shù)的指針的定義
函數(shù)指針變量定義的一般形式為:
類型說明符(*指針變量名)();
其中“類型說明符”表示被指向的函數(shù)的返回值的類型。“(*指針變量名)”表示“*”后面的變量是定義的指針變量。最后的空括號表示指針變量所指的是一個(gè)函數(shù)。
例如:
int(*pf)();
表示pf是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值(函數(shù)值)是整型。使用函數(shù)指針變量還應(yīng)注意以下兩點(diǎn):(1)函數(shù)指針變量不能進(jìn)行算術(shù)運(yùn)算。(2)函數(shù)調(diào)用中"(*指針變量名)"的兩邊的括號不可少,其中的*不應(yīng)該理解為求值運(yùn)算,在此處它只是一種表示符號。03指向函數(shù)的指針
指向函數(shù)的指針變量的賦值
指向函數(shù)的指針變量名=函數(shù)名;
如:intfunc(inta,intb); int(*p)(inta,intb); p=func;
通過指向函數(shù)的指針變量調(diào)用函數(shù)
(*指針變量名)(實(shí)參表);例8.15:用指向函數(shù)的指針的方法求兩個(gè)數(shù)的最大值。
#include<stdio.h> intMax(inta,intb) { if(a>b) returna; else returnb;} intmain() { intMax(inta,intb); int(*p
溫馨提示
- 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浙江杭州技術(shù)轉(zhuǎn)移轉(zhuǎn)化中心招聘考試核心題庫及答案解析
- 2025江西吉安市農(nóng)業(yè)農(nóng)村發(fā)展集團(tuán)有限公司及下屬子公司第二批招聘9人模擬筆試試題及答案解析
- 2025福建廈門市集美區(qū)康城幼兒園非在編教職工招聘1人筆試重點(diǎn)題庫及答案解析
- 2025中意寧波生態(tài)園控股集團(tuán)有限公司第三次招聘1人(浙江)考試重點(diǎn)試題及答案解析
- 2025貴州赤水國家糧食儲(chǔ)備庫招聘備考考試題庫及答案解析
- 2025南平市消防救援支隊(duì)招聘消防文員2人筆試重點(diǎn)試題及答案解析
- 2025廣西桂林旅游學(xué)院公開招聘教職人員控制數(shù)工作人員100人考試核心題庫及答案解析
- 2026年中國大唐集團(tuán)資本控股有限公司招聘備考核心試題附答案解析
- 2025貴州萬山宏鑫環(huán)??萍加邢挢?zé)任公司招聘備考考試試題及答案解析
- 2025重慶大學(xué)高端裝備機(jī)械傳動(dòng)全國重點(diǎn)實(shí)驗(yàn)室科研團(tuán)隊(duì)勞務(wù)派遣技術(shù)人員招聘備考核心題庫及答案解析
- 2025大理州強(qiáng)制隔離戒毒所招聘輔警(5人)筆試考試備考題庫及答案解析
- 2025年安全培訓(xùn)計(jì)劃表
- 2026年榆林職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫參考答案詳解
- 2025年沈陽華晨專用車有限公司公開招聘筆試歷年參考題庫附帶答案詳解
- 2026(蘇教版)數(shù)學(xué)五上期末復(fù)習(xí)大全(知識梳理+易錯(cuò)題+壓軸題+模擬卷)
- 垃圾中轉(zhuǎn)站機(jī)械設(shè)備日常維護(hù)操作指南
- 汽車行業(yè)可信數(shù)據(jù)空間方案
- 畜牧業(yè)機(jī)械化培訓(xùn)課件
- 工程質(zhì)量管理工作制度
- 云南交投集團(tuán)筆試試題及答案
- 東華大學(xué)《大學(xué)物理A》2025 - 2026學(xué)年第一學(xué)期期末試卷(A卷)
評論
0/150
提交評論