深入淺出理解C語言指針的綜合應(yīng)用
指針是什么?
指針是c語言中的一個重要概念,也是C語言的一個重要的特色,正確而靈活地運用它,可以使程序簡潔,緊湊,高效,每一個學(xué)習(xí)和使用c語言的人,都應(yīng)當(dāng)深入了解地學(xué)習(xí)和掌握指針,可以說,不掌握指針就是沒有掌握C的精華也可以說
指針是C語言的靈魂(doge)
由于通過地址能找到所需的變量單元,可以說,地址指向變量單元,打個比方,一個房間的門口掛了一個房間號2008,這個2008就是房間的地址,或者說,2008"指向"該房間.因此,將地址形象化地稱為“指針”。意思是通過它能找到以它為地址的內(nèi)存單元!
指針變量
使用指針變量的例子
例 通過指針變量訪問整型變量
int main() { int a = 100, b = 10;//定義整型變量a,b并初始化 int* p1, * p2; //定義指向整型數(shù)據(jù)的指針變量p1,p2; p1 = &a; //把變量a的地址賦給指針變量p1 p2 = &b; //把變量a的地址賦給指針變量p2 printf("a=%d,b=%d\n", a, b);//輸出變量a和b的值 printf("*p1=%d,*p2=%d\n", *p1, *p2); }
運行結(jié)果:
在開頭處定義了兩個指針變量p1和p2。但此時他們并未指向任何一個變量,只是提供兩個指針變量,規(guī)定他們可以指向整型變量,至于指向哪一個整型變量,要在程序中指定.。程序第五第六行的作用就是使p1指向a,使p2指向b,此時p1的值為&a(即a的地址),p2的值為&b(即為b的地址)
*注意:定義指針變量時,左側(cè)應(yīng)有類型名,否則就不是定義指針變量.
例如:
通過指針引用數(shù)組
所謂數(shù)組元素的指針就是數(shù)組元素的地址
可以用一個指針變量指向一個數(shù)組元素。例如
int arr[10]={1,3,5,7,9,11,13,15,17,19}; //定義a為包含10個整型的數(shù)組 int *p; //定義p為指向整型變量的指針變量 p=&a[0]; //把a(bǔ)[0]元素的地址賦給指針變量p
&數(shù)組名vs數(shù)組名
int arr[10];
我們知道arr是數(shù)組名,數(shù)組名表示數(shù)組收元素的地址。
那么問題來了 &arr數(shù)組名到底是什么呢??
不如我們來段代碼吧!
由此可以得出數(shù)組名和&數(shù)組名打印的地址是一樣的。
我們再來看一段代碼!
根據(jù)代碼我們發(fā)現(xiàn),其實&arr和arr,雖然值是一樣的,但是意義應(yīng)該不一樣
實際上&arr表示的是數(shù)組的地址而不是數(shù)組首元素的地址。
數(shù)組的地址+1 跳過整個數(shù)組的大小,所以&arr+1相對于&arr的差值是40.
野指針
概念:野指針就是指針指向的位置是不可知的,(隨機(jī)性的丶不正確的丶沒有明確限制的)
野指針成因
1.指針未初始化
2.指針越界訪問
如何避免野指針
- 指針初始化
- 小心指針越界
- 指針指向空間釋放即使置NULL
- 避免返回局部變量的地址
- 指針使用之前檢查有效性
指針運算
小時候我們就知道1+1等于幾 那我問你如果是指針加1的話 加的是那個數(shù)字嗎 ?
下面來看一段代碼:
這里我們可以發(fā)現(xiàn)p跟p+1相差1
這里c是多少呢 ?
16進(jìn)制的C的10進(jìn)制是12,所以q+1和q相差4
p是整型指針相當(dāng)于sizeof(int)=4
q是字符型指針相當(dāng)于sizeof(char)=1;
以上就是我歸納指針的一些小結(jié) 如果能幫助友友們
到此這篇關(guān)于深入淺出理解C語言指針的綜合應(yīng)用的文章就介紹到這了,更多相關(guān)C語言 指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC自定義消息響應(yīng)函數(shù)postmessage用法示例
這篇文章主要介紹了VC自定義消息響應(yīng)函數(shù)postmessage用法示例,并對比說明了postmessage與sendmessage的用法區(qū)別,需要的朋友可以參考下2014-10-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
本篇文章是對HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05使用C++中string實現(xiàn)任意長度的正小數(shù)、整數(shù)之間加減法方法實例
這篇文章主要介紹了利用C++中string函數(shù)實現(xiàn)任意長度的正小數(shù)、整數(shù)之間加減法方法實例,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06C++ 實現(xiàn)旋轉(zhuǎn)蛇錯覺的詳細(xì)代碼
這篇文章主要介紹了C++ 實現(xiàn)旋轉(zhuǎn)蛇錯覺的詳細(xì)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09一篇文章帶你了解C++Primer學(xué)習(xí)日記--處理數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于C++對數(shù)器的使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2021-08-08