




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 共享汽車項目投資計劃書
- 空調(diào)出租合同協(xié)議書圖片
- 股份轉(zhuǎn)讓合同協(xié)議書模板
- 廣告標書維修服務(wù)方案
- 企業(yè)數(shù)字化轉(zhuǎn)型的戰(zhàn)略規(guī)劃與實施案例
- 中國聚烯烴熱塑性彈性體項目投資計劃書
- 物流分站加盟合同協(xié)議書
- 就業(yè)協(xié)議書是勞動合同
- 健身工作室好評文案
- 制作合同協(xié)議書原聲視頻
- 護理給藥制度試題及答案
- 2025年廣東省佛山市南海區(qū)中考一模英語試題(原卷版+解析版)
- 文化藝術(shù)機構(gòu)學(xué)術(shù)委員會的職責(zé)與影響
- 2024年江蘇常州中考滿分作文《那么舊那樣新》11
- 屋面光伏工程施工組織設(shè)計
- 2025福建福州市工會專干招聘30名歷年高頻重點提升(共500題)附帶答案詳解
- 2025年水發(fā)集團有限公司招聘筆試參考題庫含答案解析
- 信息安全及保密意識培訓(xùn)
- 集成電路布圖設(shè)計專有權(quán)轉(zhuǎn)讓合同
- 2024年無人機配件定制采購合同范本3篇
- 電子商務(wù)法培訓(xùn)課件
評論
0/150
提交評論