指針(二)指針與數(shù)組、指針與函數(shù)-創(chuàng)新互聯(lián)

文章目錄
  • 一、指針與數(shù)組
    • 1. 用指針處理數(shù)組元素
    • 2. 指針數(shù)組
    • 3. 指針訪問二維數(shù)組
  • 二、指針與函數(shù)
    • 1. 指針作為函數(shù)參數(shù)
    • 2. 指針性函數(shù)
    • 3. 指向函數(shù)的指針

站在用戶的角度思考問題,與客戶深入溝通,找到鶴城網(wǎng)站設(shè)計(jì)與鶴城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鶴城地區(qū)。一、指針與數(shù)組 1. 用指針處理數(shù)組元素
  • 指針加減運(yùn)算的特點(diǎn)使得指針特別適合存儲(chǔ)在一段連續(xù)內(nèi)存空間中的同類數(shù)據(jù),而數(shù)組恰好是具有一定關(guān)系的若干同類型變量的集合體。

  • 數(shù)組元素的存儲(chǔ)在物理上也是連續(xù)的,數(shù)組名就是數(shù)組存儲(chǔ)的首地址。

int arr[5];//聲明一個(gè)int型的數(shù)組
cout<<*arr;//數(shù)組名arr就是數(shù)組的的首地址
//等價(jià)于
cout<

細(xì)節(jié):

把數(shù)組作為函數(shù)的形參,等價(jià)于指向數(shù)組元素類型的指針作為形參。

void f(int p[]);
void f(int p[3]);
void f(int *p);
//這三種寫法出現(xiàn)在形參列表中都是等價(jià)的

因?yàn)橐粋€(gè)函數(shù)要接受一個(gè)數(shù)組,它接受的是數(shù)組的首地址,而數(shù)組的首地址就是一個(gè)指針型。

拓展 :標(biāo)準(zhǔn)庫函數(shù)begin和end函數(shù)

為了讓指針的使用更簡單,更安全,C++11標(biāo)準(zhǔn)引入了兩個(gè)名為begin和end的函數(shù)

這兩個(gè)函數(shù)定義在iterator頭文件中。

begin函數(shù)返回?cái)?shù)組a首元素的指針。

end函數(shù)返回?cái)?shù)組a為**尾元素下一個(gè)位置**的指針。

#include#includeusing namespace std;
int main()
{int a[5]={1,2,3,4,5};
int *beg=begin(a);
int *last=end(a);
}
2. 指針數(shù)組
  • 如果一個(gè)數(shù)組的每個(gè)元素都是指針變量,這個(gè)數(shù)組就是指針數(shù)組。
  • 指針數(shù)組的每一個(gè)元素都必須是同一類型的指針。

聲明一維數(shù)組的語法形式為:

數(shù)據(jù)類型 * 數(shù)組名 [下標(biāo)表達(dá)式];

注意:

  • 下表表達(dá)式指出數(shù)組元素的個(gè)數(shù)
  • 類型名確定每個(gè)元素指針的類型
  • 數(shù)組名是指針數(shù)組的名稱,同時(shí)也是這個(gè)數(shù)組的首地址
  • 必須先賦值,后引用
int *p[3];//聲明含有三個(gè)指針指向int型的指針數(shù)組
int a=10;
p[0]=&a;
cout<<*p[0];
//等價(jià)于
cout<<**p;
//輸出結(jié)果都為:10
//p是指針數(shù)組的首地址,相當(dāng)于二級(jí)指針。

實(shí)例:利用指針數(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ù)組名是它的首地址,這個(gè)數(shù)組的元素個(gè)數(shù)就是二維數(shù)組的行數(shù),每個(gè)元素指向一個(gè)一維數(shù)組。

int arr[3][3]={1,2,3,4,5,6,7,8,9};
//聲明一個(gè)二維數(shù)組

這個(gè)二維數(shù)組就是由三個(gè)一維數(shù)組構(gòu)成。

二維數(shù)組命arr代表這三個(gè)一維數(shù)組的首地址,代表a[0]的地址,為二級(jí)指針。

arr[0] 則可以看作第一個(gè)一維數(shù)組的數(shù)組命,代表這個(gè)一維數(shù)組的首地址也即 a[0][0] 的地址,為一級(jí)指針。

同理 arr[1] 則可以看作第一個(gè)一維數(shù)組的數(shù)組命,代表這個(gè)一維數(shù)組的首地址也即 a[1] [0] 的地址。

注意:指針數(shù)組與二維數(shù)組的區(qū)別

指針數(shù)組與二維數(shù)組的區(qū)別

盡管指針數(shù)組與二維數(shù)組存在本質(zhì)的差異,但二者具有相同的訪問形式,可以把二維數(shù)組當(dāng)作指針數(shù)組來訪問。

實(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ù)的作用

  • 使實(shí)參與形參指針指向共同的內(nèi)存空間,以達(dá)到參數(shù)雙向傳遞的目的,即通過在被調(diào)函數(shù)中直接處理主調(diào)函數(shù)中的數(shù)據(jù)而將函數(shù)的處理結(jié)果返回其調(diào)用者。
  • 減少函數(shù)調(diào)用時(shí)數(shù)據(jù)傳遞的開銷。
  • 通過指向函數(shù)的指針傳遞函數(shù)代碼的首地址。

習(xí)慣:

如果在函數(shù)體中不需要通過指針改變指針?biāo)赶驅(qū)ο蟮膬?nèi)容,應(yīng)在參數(shù)表中將其聲明指向常量的指針,這樣使得常量對象被取地址后也可以作為該函數(shù)的參數(shù)。

const T *ptr;//T為數(shù)據(jù)類型。

實(shí)例:完成兩個(gè)數(shù)的交換(用指針作參數(shù))

void swap(int *x,int *y)//接收的是兩個(gè)地址
{int temp;
    temp=*x; 
    *x=*y;
    *y=temp;
}
int main()
{int *p1,*p2,a=100,b=10;
    p1=&a;p2=&b;   
    //完成兩個(gè)數(shù)的交換
    swap(p1,p2);//跟簡單的寫法 swap(&a,&b);
	//輸出檢查是否完成交換
    cout<
2. 指針性函數(shù)
  • 除void類型的函數(shù)外,函數(shù)在調(diào)用結(jié)束之后都要有返回值,指針也可以是函數(shù)的返回值。

  • 當(dāng)一個(gè)函數(shù)的返回值是指針類型時(shí),這個(gè)函數(shù)就是指針型函數(shù)。

  • 使用指針型函數(shù)的最主要在函數(shù)結(jié)束時(shí)把大量的數(shù)據(jù)從被調(diào)函數(shù)返回到主調(diào)函數(shù)中。

指針型函數(shù)的一般形式:

數(shù)據(jù)類型 * 函數(shù)名 (參數(shù)表)

{ 函數(shù)體 }

//只是簡單的寫個(gè)求兩數(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ù)一定的空間。
  • 每一個(gè)函數(shù)都有函數(shù)名,實(shí)際上這個(gè)函數(shù)名就表示函數(shù)的代碼在內(nèi)存的起始地址。
  • 函數(shù)指針就是專門用來存放函數(shù)代碼首地址的變量。

聲明一個(gè)函數(shù)指針時(shí),也需要說明函數(shù)的返回值,形式參數(shù)列表,其一般語法為:

數(shù)據(jù)類型 (*函數(shù)指針名)(形參表)

函數(shù)指針在使用之前也要進(jìn)行賦值,使指針指向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。

一般語法為:

函數(shù)指針名=函數(shù)名;

注意:

  • 等號(hào)右邊的函數(shù)名所指出的必須是一個(gè)已經(jīng)聲明過的、和函數(shù)指針具有相同返回類型和相同形參表的函數(shù)
//只是簡單的寫個(gè)函數(shù),說明用法。
int f(int x)//定義一個(gè)f函數(shù)
{return x;   }
int main()
{int num;
    cin>>num;
    int (*p)(int);
    //聲明一個(gè)形參為int,返回值類型為int的函數(shù)指針
    p=f;//將函數(shù)f的起始地址賦給p
    //測試
    cout<

拓展:

由于對函數(shù)指針的定義在形式上比較復(fù)雜,如果在程序中出現(xiàn)多個(gè)這樣的定義,多次重復(fù)這樣的定義會(huì)相當(dāng)繁瑣,一個(gè)很好的解決方法是使用 typedef 。

typedef int (*function)(double);
//聲明“function為一個(gè)double形參,返回值類型int的函數(shù)的指針”類型的別名。
//使用。
function f;
//f就是該類型為function的函數(shù)指針。

關(guān)于 typedef 的用法以后我會(huì)專門做一期來講。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

標(biāo)題名稱:指針(二)指針與數(shù)組、指針與函數(shù)-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://bm7419.com/article44/gjgee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站制作、做網(wǎng)站、自適應(yīng)網(wǎng)站、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)