printf不明确_资源贴|不是吧,还有人不知道指针?你想知道还不点进来看看?...
??? C語言中最難學也是最難理解的莫過于指針,相當多的同學在學到“指針”這一章節的時候,被這一個拗口又難以理解的詞澆了一盆冷水,學習C語言的熱情一下子降了一大半。那么今天我們就來探討一下"指針”吧!
一:通過一個變量的聲明來探究指針
int val = 10;
初學C語言常用的一個變量的定義,整形數據類型,并且將10賦值給val。
那么在定義一個變量的過程中,計算機內部發生了啥呢?
首先我類比一個生活中的例子:
栗一為了方便統計,水果商人給水果定了一個不同的編號,例如蘋果111,梨子222在后續統計價目的時候,111就可以對應蘋果,222就可以對應梨子
在這里111的價格是10,對應著蘋果的價格是10,梨子和香蕉同理,也就是說蘋果有另一個“稱呼”:111
那么這對我們理解定義一個變量有什么聯系呢?
在編譯器內,定義了一個變量后,它會向內存中申請一段可用的地址空間用來存放數據,這塊地址為了更好的方便用戶使用,咱們可以用一個名字來替代這地址,也就是所謂的變量名,也即是上圖中的水果名字和水果編號之間的關系。在后續的使用中,這變量的名字就直接代替了地址空間,給變量賦值,也即把數據放入地址空間中去。換句話說,二者本無區別,只是為了更好的記錄某些東西(數據)。這會兒在來看看int val = 10;,是不是有不同的感覺了?
二:與指針的聯系
在前面討論了一個變量的定義的背后,發生了啥,接下來引入指針,在引入指針還是先看一下這個:
int val = 10;
我們把val看成是一個蘋果,我們不希望記錄單詞,只想用數字來代替這個蘋果,比如我們用數字:?8386848來代替它,那么我們在給這塊地址重新賦值的時候,是不是也可以放入val,也可以說是放入8386848。
理解了上述,那么我們引入一個針對上面val變量的指針:
1.int val = 10;
2.int *pVal; //定義一個指向int類型的指針pVal
3.pVal = &val;? //將指針pval指向變量val
指針的定義通常是:
數據類型 *變量名; //注意這里的 星號
必須要明確一點,指針不是什么玄乎的東西,它與val一樣也是一個變量,只是這個“變量”的用途比較特殊,他專門用來存放地址的,注意是專門,不能用來存放別的數據。可能有小伙伴對地址這個概念還比較模糊,這里我用比喻的方法講一下地址:
栗二想象一下,你是一個送牛奶的,你必須得把你手上的牛奶送到不同的住宅里面去,你不可能根據名字去找,因為有可能有相同名字的顧客,導致出錯。每一個住宅都有一個唯一的編號,比如說住宅A的編號是A0大道11街32戶,住宅B是B1大道22街39戶,根據這個你便能準確無誤的把牛奶送到顧客手上。這里的牛奶看作是數據,編號看作是地址,顧客名字看作是變量。
上述例子可能不是很恰當,但是對理解地址來說應該是有幫助的。
指針變量的作用呢,就是用來存放這些地址的。
在計算機內存中,地址空間實際上也是一串串數字構成的,運行以下代碼:
1.? ?#include
2.
3.? ?int main()
4.? ?{
5.int val = 10;
6.int* pVal; //定義一個指向int類型的指針pVal
7.pVal = &val;
8.printf("指針變量的值%d, 變量val的地址:%d\n", pVal, &val);
9.printf("指針變量取值結果:%d, 變量val的值: %d\n", *pVal, ?? val);
10.}
輸出結果:
1.指針變量的值13630100, 變量val的地址:13630100
2.指針變量取值結果:10, 變量val的值: 10
可以發現指針變量的值實際上就是變量val的地址,指針取值操作后的值就是變量val的值。細心的同學也能發現指針變量自己也有一個地址,沒錯,因為他也是一個變量,它自身也是需要申請地址空間的。這也是為啥后面會有指向指針的指針(二級指針),以及更復雜的三級指針。
三:與指針有關的兩個操作符號
學過一點指針知識的同學都知道與指針相關的符號有?*?和?&
*?:星號,有兩個不同的用法:1、定義指針的時候,它表明該變量是一個指針,而不是其他類型的變量,例如:int val;?和?int *pval;是兩個完全不同的意思,前者是定義一個int類型的變量,后者是定義了一個指向int類型的指針變量。2、取值操作的時候,它表示的是取出該地址存放的值,上述代碼中的val的值,也就是10。
&:ampersand,意義也很簡單,返回一個變量的地址。例如&val,就是返回變量val在內存中的地址空間,假如該變量地址是 13630100,那么返回的數據就是13630100。返回的數據可以用一個指針變量來存放,也必須是指針變量來存放。
1.int val;
2.int *p;
3.&val // 返回變量val所在的地址。
4.&p ?// 返回指針變量p所在的地址,也是由指針存放,不過是由二級指針存放。
四:總結
指針,其實也是地址的另一個代名詞而已,指針即是地址,地址也可以說是指針,只是叫法不一樣。指針變量與其他類型的變量一樣,也是用來存放數據的,只是這個數據稍稍有些特殊:地址。與指針有關的兩個操作分別是*和&,*在定義和取值操作的時候代表的不同的含義,一個是定義指針變量,一個是取出指針變量存放的地址中的值。&的作用是返回該變量的地址。在后續的學習中,會發現數組名字其實就是一個指針變量,指針變量也能進行 加 和 減的操作,由于是地址是數字,加減操作后的結果也是數字。在更后續的學習中會學習到二級,三級指針,還有函數指針等等。
(如有錯誤,歡迎指正)
往期看點
▼
“碼”上學習|程序的“靈魂”之排序算法
Shining|“碼”上學習---初探前端
Take you fly|游戲開發
本期編輯:賴聲宇
圖文來源:1804 朱英鵬
責任編輯:黃福娣
審核人:翁麗明
因為你的分享、點贊、在看我有足足的精氣神兒! 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的printf不明确_资源贴|不是吧,还有人不知道指针?你想知道还不点进来看看?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可基于文本生成图像了,微软宣布必应聊天整
- 下一篇: 如何获取当日日期_Power BI时间智