您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關c語言指針有什么用的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
c語言指針用法:1、指針變量與普通變量一樣默認值不確定,一般初始化為NULL;2、指針變量的用法與普通變量不同,一般以p結尾加以區分;3、指針變量的類型決定了通過指針變量訪問內存時訪問幾個字節。
c語言指針用法:
一,指針定義:
指針變量的取值范圍取值0~4G,是一種數據類型(無符號整數,代表了內存編號)。它可以用來定義變量(與int、long一樣),與int、long不同的它存儲整數代表了內存的編號,通過這個變量可以訪問對應編號的內存。
二,指針的作用
1、堆內存無法取名字(無法使用標識符與堆內存建立聯系),必須配合指針。
2、函數之間的參數是值傳遞(內存拷貝),使用指針可以優化參數的傳遞效率(需要對變量進行保護)。因為C語言采用的是值傳遞(內存拷貝),會隨著變量字節數的增加而降低運行效率而傳遞變量的地址永遠只拷貝4或8字節。
void func(const int* p);
但使用指針變量的值可能會被修改,可以配合const。
3、函數之間是相互獨立的,有時協同配合需要共享變量(全局變量過多會造成命名沖突,不會被釋放浪費內存),函數之間傳遞變量的地址可以達到共享變量的效果。
三,指針的用法:
定義:類型* 變量名_p;
1、指針變量與普通變量一樣默認值不確定,一般初始化為NULL。
2、指針變量的用法與普通變量不同,一般以p結尾加以區分。
3、指針變量的類型決定了通過指針變量訪問內存時訪問幾個字節。
4、指針變量不能連續定義(一個*只能定義出一個指針變量):
int* p1,p2;
// p是指針,p2是int類型變量
int *p1,*p2;
// p1和p2都是指針變量
賦值:指針變量 = 內存編號。 變量名_p = 地址;
內存編號要能夠訪問,如果編號錯誤可能會造成段錯誤。void*可以與任意類型指針進行自動轉換(C++中不行)。要保障地址與物理內存有對應關系(映射過),否則有段錯誤。
int* p = malloc(4); int* p = # // 引用內存
訪問:*指針變量 //解引用----訪問指針變量
根據指針變量中存儲的內存編號去訪問對應的內存。如果之前賦值的內存編號有誤,這個步驟會出現段錯誤。訪問的字節由指針類型決定。 int* p = # *p <=> num;
5,指針運算
指針變量中存儲的就是整數,因此為整型數據能使用的運算符指針變量基本都能使用
,但不是所有運算都有意義。
指針+整數 = 指針+寬度*整數
指針-整數 = 指針-寬度*整數 // 指針進行前后移動
指針-指針 = (指針-指針)/寬度 // 兩個指針之間相隔多少個元素
指針 >、<、<=、>= 指針 可以判斷兩個誰在前誰在后。
6,數組與指針
.數組名就是個特殊的地址,也能當指針使用,數組名是個常量(數組名與數組第一個元素的首地址是對應關系,普通指針是指向關系)。數組名可以使用指針的解引用,而指針變量也可以使用數組的[];arr[i] <=> *(arr+i)。數組當函數的參數就脫變成了指針變量,長度丟失,安全性也變小void func(int * const arr,size_t len);
7,指針的高級使用
數組指針與指針數組:
(1).數組指針(指針):專門用來指向數組的指針。
int arr[10]; int (*p)[10] = arr; int* p = #
void func(int I,int J,int(*arr)[J])
//二維數組 函數傳參使用數組指針
(2).指針數組(數組):一個數組里存儲的數據類型是指針。
把無序的離散數據,歸納到一起。
int* arr[3]; <=> int *p1,*p2,*p3;
(3).二級值針: 指向指針的指針
4.函數指針: 指向函數的指針(不能解引用)
9,const 指針
const int * p;
// 不能通過解引用去修改指針所指向的內存的數據
(1)保護函數的參數
(2)當指針指向的是只讀數據,也應該加上const防止出現段錯誤。
int const * p;
// 同上
int* const p;
// 不能修改指針變量的值
可以防止指針變量意外變成野指針
const int* const p;
// 既保存指針所指針的內存,也保護指針變量
int const * const p;
// 同上
運行:
*p_num=10 請輸入一個數字:1 *p_num是1 *ptr=10
10,注意事項:
空指針:
變量指針的值等于NULL,這種指針叫空指針。
不能對空指針解引用,一定會出現段錯誤。
當操作重啟時會跳轉NULL地址,進行重啟,因此NULL存儲操作系統用于重啟的數據。
NULL在C語言中是一種錯誤標志,如果函數的返回值是指針類型,
結果一旦NULL表示函數執行出錯或失敗。
如何避免空指針造成的段錯誤?
使用來歷不明(函數的參數)的指針前先進行檢查,if(NULL == p)。
野指針:
指針變量的值不確定,使用野指針不一定會出錯。
int* p; // 野指針
使用野指針的后果:段錯誤。
注意:野指針是無法分辨的,所以比空指針危害更。
如何避免野指針造成的錯誤?
所有的野指針都人制造出來的,只要人人都不制造野指針就會有野指針造成的錯誤。
定義指針變量時一定要初始化。
指針變量所指向的內存初始釋放后要及時賦值為空(堆內存)。不返回局部變量的地址。
感謝各位的閱讀!關于c語言指針有什么用就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。