C語言全方位講解指針的使用_第1頁
C語言全方位講解指針的使用_第2頁
C語言全方位講解指針的使用_第3頁
C語言全方位講解指針的使用_第4頁
C語言全方位講解指針的使用_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C語言全方位講解指針的使用目錄一、指針的概念1.1、變量和地址1.2、指針變量和指針的類型二、指針變量2.1、指針變量的定義及使用2.2、指針運算三、野指針3.1、概念:3.2、野指針的成因3.3、如何規(guī)避野指針四、字符指針4.1、字符指針類型4.2、例題五、指針與數(shù)組5.1、指針與二維數(shù)組5.2、多級指針六、指針數(shù)組七、數(shù)組指針7.1、數(shù)組指針的定義7.2、數(shù)組名與數(shù)組名7.3、數(shù)組指針的使用八、指針與函數(shù)8.1、函數(shù)指針的定義8.2、指向函數(shù)的指針總結(jié)接著上次的函數(shù)的基本知識,今天我們來講一講指針

一、指針的概念

1.1、變量和地址

所謂指針,也就是內(nèi)存的地址;所謂指針變量,也就是保存了內(nèi)存地址的變量。

總結(jié):指針就是變量,用指針存放地址(口語中說的指針通常指的是指針變量)

1.2、指針變量和指針的類型

指針變量就是一個變量,它存儲的內(nèi)容是一個指針。在我們定義一個變量的時候,要確定它的類型。在定義指針變量時也是一樣的,必須確定指針類型。int變量的指針需要用int類型的指針存儲,float變量的指針需要用float類型的指針存儲。

指針類型決定了:指針解引用的權(quán)限有多大與指針走一步走多大字節(jié)(步長)

整型指針+1跳過一個整型。字符指針+1跳過一個字符

二、指針變量

2.1、指針變量的定義及使用

(1)指針變量的定義

指針變量的定義形式如:數(shù)據(jù)類型*指針名;例如:

int*x;//整型指針變量

float*f;//浮點型指針變量

char*ch;//字符型指針變量

指針的變量名分別是:x;f和ch。而int*;float*與char*分別是他們中存儲的數(shù)據(jù)的類型。

(2)指針變量的使用

取地址運算符:單目運算符是用來取操作對象的地址。例:i為取變量i的地址。對于常量表達式、寄存器變量不能取地址(因為它們存儲在存儲器中,沒有地址)。

指針運算符*(解引用運算符):與為逆運算,作用是通過操作對象的地址,獲取存儲的內(nèi)容。例:x=i,x為i的地址,*x則為通過i的地址,獲取i的內(nèi)容。

//聲明了一個普通變量a

inta;

//聲明一個指針變量,指向變量a的地址

int*pa;

//通過取地址符,獲取a的地址,賦值給指針變量

pa=

//通過間接尋址符,獲取指針指向的內(nèi)容

printf("%d",*pa);

2.2、指針運算

(1)指針與整數(shù)的加減運算

指針變量的自增自減運算。指針加1或減1運算,表示指針向前或向后移動一個單元(不同類型的指針,單元長度不同)。

(2)指針減指針

前提是兩個指針指向同一個空間。

指針減指針得到兩個指針間的元素個數(shù)

例:Arr[9]指向9與10中間部分(下標)

三、野指針

3.1、概念:

野指針就是指針指向的為止是不可知的(隨機的,不正確的,沒有明確限制的)

3.2、野指針的成因

(1)指針未初始化

(2)指針越界

如圖:在第十次訪問時,可以進入到循環(huán),相當(dāng)于從第10個點向后訪問4個字節(jié),之后的字節(jié)不屬于原數(shù)組,則越界了,則稱為野指針。(只有在超出范圍后,在會發(fā)生崩潰)

//越界訪問

*intarr[10]={0};

int*p=arr;

inti=0;

for(i=0;i=10;i++)//共執(zhí)行了11次,而arr數(shù)組總共只有10個元素

*p=i;

p++;

}

(3)指針指向的空間釋放

int*test()//局部變量

inta=10;

return

intmain()

int*p=test();//返回值是a的地址,而局部變量在引用之后就會銷毀。

*p=20;

return0;

}

3.3、如何規(guī)避野指針

1.指針初始化

2.小心指針越界。

3.指針指向空間釋放即置NULL

4.指針使用之前檢查有效性。

四、字符指針

4.1、字符指針類型

在指針的類型中我們知道有一種指針類型為字符指針char*;一般使用:

intmain()

constchar*pstr="hello";//這里是把一個字符串放到pstr指針變量里了嗎?

printf("%s\n",pstr);

return0;}

本質(zhì)是把字符串hello首字符的地址放到了pstr中。

4.2、例題

intmain()

charstr1[]="hellobit.";

charstr2[]="hellobit.";

constchar*str3="hellobit.";

constchar*str4="hellobit.";

if(str1==str2)

printf("str1andstr2aresame\n");

else

printf("str1andstr2arenotsame\n");

if(str3==str4)

printf("str3andstr4aresame\n");

else

printf("str3andstr4arenotsame\n");

return0;

}

最終輸出的結(jié)果是

這里str3和str4指向的是一個同一個常量字符串。C/C++會把常量字符串存儲到單獨的一個內(nèi)存區(qū)域。當(dāng)幾個指針指向同一個字符串的時候,他們實際會指向同一塊內(nèi)存。但是用相同的常量字符串去初始化不同的數(shù)組的時候就會開辟出不同的內(nèi)存塊。所以str1和str2不同,str3和str4不同。

五、指針與數(shù)組

之前我們可以通過下標訪問數(shù)組元素,學(xué)習(xí)了指針之后,我們可以通過指針訪問數(shù)組的元素。在數(shù)組中,數(shù)組名即為該數(shù)組的首地址,結(jié)合上面指針和整數(shù)的加減,我們就可以實現(xiàn)指針訪問數(shù)組元素。

5.1、指針與二維數(shù)組

(1)二維數(shù)組的地址

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int*p=a[0];//此處的p內(nèi)存放的數(shù)組a第一行的地址。

5.2、多級指針

(1)多級指針(指向指針的指針)

指針變量作為一個變量也有自己的存儲地址,而指向指針變量的存儲地址就被稱為指針的指針,即二級指針。依次疊加,就形成了多級指針。

指針變量也是一種變量,也會占用存儲空間,也可以使用獲取它的地址。C語言不限制指針的級數(shù),每增加一級指針,在定義指針變量時就得增加一個星號*。p1是一級指針,指向普通類型的數(shù)據(jù),定義時有一個*;p2是二級指針,指向一級指針p1,定義時有兩個*。例:假設(shè)有一個int類型的變量a,p1是指向a的指針變量,p2又是指向p1的指針變量,它們的關(guān)系如下圖所示:

六、指針數(shù)組

1.parr的第一個數(shù)組里放arr1的首元素地址

2.parr每個元素的類型是int*。

3.該數(shù)組里每個元素都是指針,所以它是一個指針數(shù)組

4.Parr[i][j],也可以寫成parr[i]+j,

5.相當(dāng)于地址+j為向后挨個元素指向

七、數(shù)組指針

7.1、數(shù)組指針的定義

如以下語句:

int(*p)[10];

//解釋:p先和*結(jié)合,說明p是一個指針變量,然后指著指向的是一個大小為10個整型的數(shù)組。

//所以p是一個指針,指向一個數(shù)組,叫數(shù)組指針。

//這里要注意:[]的優(yōu)先級要高于*號的,所以必須加上()來保證p先和*結(jié)合。

7.2、數(shù)組名與數(shù)組名

讓我們看一段代碼

#includestdio.h

intmain()

intarr[10]={0};

printf("arr=%p\n",arr);

printf("arr=%p\n",arr);

printf("arr+1=%p\n",arr+1);

printf("arr+1=%p\n",arr+1);

return0;

}

運行結(jié)果如下

根據(jù)上面的代碼我們發(fā)現(xiàn),其實arr和arr,雖然值是一樣的,但是意義應(yīng)該不一樣的。

實際上:arr表示的是數(shù)組的地址,而不是數(shù)組首元素的地址。(細細體會一下)

本例中arr的類型是:int(*)[10],是一種數(shù)組指針類型。

數(shù)組的地址+1,跳過整個數(shù)組的大小。

7.3、數(shù)組指針的使用

#includestdio.h

voidprint_arr1(intarr[3][5],introw,intcol)//形參用數(shù)組來接受

inti=0;

for(i=0;ii++)

for(j=0;jj++)

printf("%d",arr[i][j]);

voidprint_arr2(int(*arr)[5],introw,intcol)//形參用數(shù)組指針來接受

inti=0;

for(i=0;ii++)

for(j=0;jj++)

{printf("%d",arr[i][j]);}

printf("\n");}}

intmain()

intarr[3][5]={1,2,3,4,5,6,7,8,9,10};

print_arr1(arr,3,5);

//數(shù)組名arr,表示首元素的地址

//但是二維數(shù)組的首元素是二維數(shù)組的第一行

//所以這里傳遞的arr,其實相當(dāng)于第一行的地址,是一維數(shù)組的地址

//可以數(shù)組指針來接收

print_arr2(arr,3,5);

return0;}

八、指針與函數(shù)

8.1、函數(shù)指針的定義

returnType(*pointerName)(paramlist);

其中,returnType為函數(shù)返回值類型,pointerNmae為指針名稱,paramlist為函數(shù)參數(shù)列表。參數(shù)列表中可以同時給出參數(shù)的類型和名稱,也可以只給出參數(shù)的類型,省略參數(shù)的名稱,這一點和函數(shù)原型非常類似。注意()的優(yōu)先級高于*,第一個括號不能省略,如果寫作returnType*pointerNa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論