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视频教程
以上是c語言指標用法有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!