指針加減運算的特點使得指針特別適合存儲在一段連續(xù)內(nèi)存空間中的同類數(shù)據(jù),而數(shù)組恰好是具有一定關(guān)系的若干同類型變量的集合體。
數(shù)組元素的存儲在物理上也是連續(xù)的,數(shù)組名就是數(shù)組存儲的首地址。
int arr[5];//聲明一個int型的數(shù)組
cout<<*arr;//數(shù)組名arr就是數(shù)組的的首地址
//等價于
cout<
細節(jié):
把數(shù)組作為函數(shù)的形參,等價于指向數(shù)組元素類型的指針作為形參。
void f(int p[]);
void f(int p[3]);
void f(int *p);
//這三種寫法出現(xiàn)在形參列表中都是等價的
因為一個函數(shù)要接受一個數(shù)組,它接受的是數(shù)組的首地址,而數(shù)組的首地址就是一個指針型。
拓展 :標(biāo)準(zhǔn)庫函數(shù)begin和end函數(shù)
為了讓指針的使用更簡單,更安全,C++11標(biāo)準(zhǔn)引入了兩個名為begin和end的函數(shù)
這兩個函數(shù)定義在iterator頭文件中。
begin函數(shù)返回數(shù)組a首元素的指針。
end函數(shù)返回數(shù)組a為**尾元素下一個位置**的指針。
#include#includeusing namespace std;
int main()
{int a[5]={1,2,3,4,5};
int *beg=begin(a);
int *last=end(a);
}
2. 指針數(shù)組
- 如果一個數(shù)組的每個元素都是指針變量,這個數(shù)組就是指針數(shù)組。
- 指針數(shù)組的每一個元素都必須是同一類型的指針。
聲明一維數(shù)組的語法形式為:
數(shù)據(jù)類型 * 數(shù)組名 [下標(biāo)表達式];
注意:
- 下表表達式指出數(shù)組元素的個數(shù)
- 類型名確定每個元素指針的類型
- 數(shù)組名是指針數(shù)組的名稱,同時也是這個數(shù)組的首地址
- 必須先賦值,后引用
int *p[3];//聲明含有三個指針指向int型的指針數(shù)組
int a=10;
p[0]=&a;
cout<<*p[0];
//等價于
cout<<**p;
//輸出結(jié)果都為:10
//p是指針數(shù)組的首地址,相當(dāng)于二級指針。
實例:利用指針數(shù)組輸出單位矩陣
#includeusing namespace std;
int main()
{int line1[]={1,0,0};
int line2[]={0,1,0};
int line3[]={0,0,1};
//定義數(shù)組,三行矩陣
int *pline[3]={line1,line2,line3};//定義整形指針數(shù)組并初始化
for(int i=0;i<3;i++) //對指針數(shù)組元素循環(huán)
{for(int j=0;j<3;j++) //對矩陣每一行循環(huán)
cout<
3. 指針訪問二維數(shù)組二維數(shù)組在內(nèi)存種是以行優(yōu)先的方式按照一維順序關(guān)系存放的,因此對于二維數(shù)組,可以將其理解為一維數(shù)組的一堆數(shù)組,數(shù)組名是它的首地址,這個數(shù)組的元素個數(shù)就是二維數(shù)組的行數(shù),每個元素指向一個一維數(shù)組。
int arr[3][3]={1,2,3,4,5,6,7,8,9};
//聲明一個二維數(shù)組
這個二維數(shù)組就是由三個一維數(shù)組構(gòu)成。
二維數(shù)組命arr代表這三個一維數(shù)組的首地址,代表a[0]的地址,為二級指針。
arr[0] 則可以看作第一個一維數(shù)組的數(shù)組命,代表這個一維數(shù)組的首地址也即 a[0][0] 的地址,為一級指針。
同理 arr[1] 則可以看作第一個一維數(shù)組的數(shù)組命,代表這個一維數(shù)組的首地址也即 a[1] [0] 的地址。
注意:指針數(shù)組與二維數(shù)組的區(qū)別
盡管指針數(shù)組與二維數(shù)組存在本質(zhì)的差異,但二者具有相同的訪問形式,可以把二維數(shù)組當(dāng)作指針數(shù)組來訪問。
實例:
int mian()
{int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
//依次訪問二維數(shù)組并輸出
for(int i=0;i
同理,可以對三維數(shù)組為例自行分析。
二、指針與函數(shù) 1. 指針作為函數(shù)參數(shù)以指針作為函數(shù)參數(shù)的作用
- 使實參與形參指針指向共同的內(nèi)存空間,以達到參數(shù)雙向傳遞的目的,即通過在被調(diào)函數(shù)中直接處理主調(diào)函數(shù)中的數(shù)據(jù)而將函數(shù)的處理結(jié)果返回其調(diào)用者。
- 減少函數(shù)調(diào)用時數(shù)據(jù)傳遞的開銷。
- 通過指向函數(shù)的指針傳遞函數(shù)代碼的首地址。
習(xí)慣:
如果在函數(shù)體中不需要通過指針改變指針?biāo)赶驅(qū)ο蟮膬?nèi)容,應(yīng)在參數(shù)表中將其聲明指向常量的指針,這樣使得常量對象被取地址后也可以作為該函數(shù)的參數(shù)。
const T *ptr;//T為數(shù)據(jù)類型。
實例:完成兩個數(shù)的交換(用指針作參數(shù))
void swap(int *x,int *y)//接收的是兩個地址
{int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{int *p1,*p2,a=100,b=10;
p1=&a;p2=&b;
//完成兩個數(shù)的交換
swap(p1,p2);//跟簡單的寫法 swap(&a,&b);
//輸出檢查是否完成交換
cout<
2. 指針性函數(shù)
除void類型的函數(shù)外,函數(shù)在調(diào)用結(jié)束之后都要有返回值,指針也可以是函數(shù)的返回值。
當(dāng)一個函數(shù)的返回值是指針類型時,這個函數(shù)就是指針型函數(shù)。
使用指針型函數(shù)的最主要在函數(shù)結(jié)束時把大量的數(shù)據(jù)從被調(diào)函數(shù)返回到主調(diào)函數(shù)中。
指針型函數(shù)的一般形式:
數(shù)據(jù)類型 * 函數(shù)名 (參數(shù)表)
{ 函數(shù)體 }
//只是簡單的寫個求兩數(shù)和函數(shù),說明用法。
int* f(int x,int y)
{int p=x+y;
return &p;
}
int main()
{int num1,num2;
cin>>num1>>num2;
cout<<*f(num1,num2);//返回的f(1)為指針,
}
3. 指向函數(shù)的指針
- 執(zhí)行程序的代碼也想數(shù)據(jù)一樣被調(diào)入內(nèi)存并占據(jù)一定的空間。
- 每一個函數(shù)都有函數(shù)名,實際上這個函數(shù)名就表示函數(shù)的代碼在內(nèi)存的起始地址。
- 函數(shù)指針就是專門用來存放函數(shù)代碼首地址的變量。
聲明一個函數(shù)指針時,也需要說明函數(shù)的返回值,形式參數(shù)列表,其一般語法為:
數(shù)據(jù)類型 (*函數(shù)指針名)(形參表)
函數(shù)指針在使用之前也要進行賦值,使指針指向一個已經(jīng)存在的函數(shù)代碼的起始地址。
一般語法為:
函數(shù)指針名=函數(shù)名;
注意:
- 等號右邊的函數(shù)名所指出的必須是一個已經(jīng)聲明過的、和函數(shù)指針具有相同返回類型和相同形參表的函數(shù)
//只是簡單的寫個函數(shù),說明用法。
int f(int x)//定義一個f函數(shù)
{return x; }
int main()
{int num;
cin>>num;
int (*p)(int);
//聲明一個形參為int,返回值類型為int的函數(shù)指針
p=f;//將函數(shù)f的起始地址賦給p
//測試
cout<
拓展:
由于對函數(shù)指針的定義在形式上比較復(fù)雜,如果在程序中出現(xiàn)多個這樣的定義,多次重復(fù)這樣的定義會相當(dāng)繁瑣,一個很好的解決方法是使用 typedef 。
typedef int (*function)(double);
//聲明“function為一個double形參,返回值類型int的函數(shù)的指針”類型的別名。
//使用。
function f;
//f就是該類型為function的函數(shù)指針。
關(guān)于 typedef 的用法以后我會專門做一期來講。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
標(biāo)題名稱:指針(二)指針與數(shù)組、指針與函數(shù)-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://aaarwkj.com/article44/gjgee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站制作、做網(wǎng)站、自適應(yīng)網(wǎng)站、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)