溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

c語言指針有什么用

發(fā)布時間:2020-11-03 10:39:21 來源:億速云 閱讀:304 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)c語言指針有什么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

c語言指針用法:1、指針變量與普通變量一樣默認值不確定,一般初始化為NULL;2、指針變量的用法與普通變量不同,一般以p結(jié)尾加以區(qū)分;3、指針變量的類型決定了通過指針變量訪問內(nèi)存時訪問幾個字節(jié)。

c語言指針用法:

一,指針定義:

指針變量的取值范圍取值0~4G,是一種數(shù)據(jù)類型(無符號整數(shù),代表了內(nèi)存編號)。它可以用來定義變量(與int、long一樣),與int、long不同的它存儲整數(shù)代表了內(nèi)存的編號,通過這個變量可以訪問對應(yīng)編號的內(nèi)存。

二,指針的作用

1、堆內(nèi)存無法取名字(無法使用標識符與堆內(nèi)存建立聯(lián)系),必須配合指針。

2、函數(shù)之間的參數(shù)是值傳遞(內(nèi)存拷貝),使用指針可以優(yōu)化參數(shù)的傳遞效率(需要對變量進行保護)。因為C語言采用的是值傳遞(內(nèi)存拷貝),會隨著變量字節(jié)數(shù)的增加而降低運行效率而傳遞變量的地址永遠只拷貝4或8字節(jié)。

void func(const int* p);但使用指針變量的值可能會被修改,可以配合const。

3、函數(shù)之間是相互獨立的,有時協(xié)同配合需要共享變量(全局變量過多會造成命名沖突,不會被釋放浪費內(nèi)存),函數(shù)之間傳遞變量的地址可以達到共享變量的效果。

三,指針的用法:

定義:類型* 變量名_p;  

1、指針變量與普通變量一樣默認值不確定,一般初始化為NULL。

2、指針變量的用法與普通變量不同,一般以p結(jié)尾加以區(qū)分。

3、指針變量的類型決定了通過指針變量訪問內(nèi)存時訪問幾個字節(jié)。

4、指針變量不能連續(xù)定義(一個*只能定義出一個指針變量):

 int* p1,p2; // p是指針,p2是int類型變量

 int *p1,*p2; // p1和p2都是指針變量

賦值:指針變量 = 內(nèi)存編號。   變量名_p = 地址;

內(nèi)存編號要能夠訪問,如果編號錯誤可能會造成段錯誤。void*可以與任意類型指針進行自動轉(zhuǎn)換(C++中不行)。要保障地址與物理內(nèi)存有對應(yīng)關(guān)系(映射過),否則有段錯誤。

 int* p = malloc(4);
 int* p = # // 引用內(nèi)存

訪問:*指針變量 //解引用----訪問指針變量

根據(jù)指針變量中存儲的內(nèi)存編號去訪問對應(yīng)的內(nèi)存。如果之前賦值的內(nèi)存編號有誤,這個步驟會出現(xiàn)段錯誤。訪問的字節(jié)由指針類型決定。     int* p = #                   *p <=> num;

5,指針運算

指針變量中存儲的就是整數(shù),因此為整型數(shù)據(jù)能使用的運算符指針變量基本都能使用

,但不是所有運算都有意義。

指針+整數(shù) = 指針+寬度*整數(shù)

指針-整數(shù) = 指針-寬度*整數(shù) // 指針進行前后移動

指針-指針 = (指針-指針)/寬度 // 兩個指針之間相隔多少個元素

指針 >、<、<=、>= 指針 可以判斷兩個誰在前誰在后。

6,數(shù)組與指針

.數(shù)組名就是個特殊的地址,也能當指針使用,數(shù)組名是個常量(數(shù)組名與數(shù)組第一個元素的首地址是對應(yīng)關(guān)系,普通指針是指向關(guān)系)。數(shù)組名可以使用指針的解引用,而指針變量也可以使用數(shù)組的[];arr[i] <=> *(arr+i)。數(shù)組當函數(shù)的參數(shù)就脫變成了指針變量,長度丟失,安全性也變小void func(int * const arr,size_t len);

7,指針的高級使用

數(shù)組指針與指針數(shù)組:

(1).數(shù)組指針(指針):專門用來指向數(shù)組的指針。

int arr[10];
int (*p)[10] = arr;
int* p = &num;

void func(int I,int J,int(*arr)[J]) //二維數(shù)組 函數(shù)傳參使用數(shù)組指針

(2).指針數(shù)組(數(shù)組):一個數(shù)組里存儲的數(shù)據(jù)類型是指針。

把無序的離散數(shù)據(jù),歸納到一起。

int* arr[3]; <=> int *p1,*p2,*p3;

(3).二級值針: 指向指針的指針

4.函數(shù)指針: 指向函數(shù)的指針(不能解引用)

9,const 指針

const int * p; // 不能通過解引用去修改指針所指向的內(nèi)存的數(shù)據(jù)

(1)保護函數(shù)的參數(shù)

(2)當指針指向的是只讀數(shù)據(jù),也應(yīng)該加上const防止出現(xiàn)段錯誤。

int const * p; // 同上

int* const p; // 不能修改指針變量的值

可以防止指針變量意外變成野指針

const int* const p; // 既保存指針所指針的內(nèi)存,也保護指針變量

int const * const p; // 同上

運行:

*p_num=10
請輸入一個數(shù)字:1
*p_num是1
*ptr=10

10,注意事項:

空指針:

  • 變量指針的值等于NULL,這種指針叫空指針。

  • 不能對空指針解引用,一定會出現(xiàn)段錯誤。

  • 當操作重啟時會跳轉(zhuǎn)NULL地址,進行重啟,因此NULL存儲操作系統(tǒng)用于重啟的數(shù)據(jù)。

  • NULL在C語言中是一種錯誤標志,如果函數(shù)的返回值是指針類型,

  • 結(jié)果一旦NULL表示函數(shù)執(zhí)行出錯或失敗。

如何避免空指針造成的段錯誤?

使用來歷不明(函數(shù)的參數(shù))的指針前先進行檢查,if(NULL == p)。

野指針:指針變量的值不確定,使用野指針不一定會出錯。

int* p; // 野指針

使用野指針的后果:段錯誤。

注意:野指針是無法分辨的,所以比空指針危害更。

如何避免野指針造成的錯誤?

  • 所有的野指針都人制造出來的,只要人人都不制造野指針就會有野指針造成的錯誤。

  • 定義指針變量時一定要初始化。

  • 指針變量所指向的內(nèi)存初始釋放后要及時賦值為空(堆內(nèi)存)。不返回局部變量的地址。

感謝各位的閱讀!關(guān)于c語言指針有什么用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI