指針的定義:
指針是一種復合數據類型。它是對一類變量的描述。就像街道門牌的號碼!例如有一條X的街道,它有1024棟房子。那麼每棟房子可以用X[0-1024]來索引。假如我們每棟房子都可以保存一個整數值,那麼X街就有1024個不同的整型變量。而且每個變量都是可以使用房屋的編號去訪問。其實這裡的每棟房子的編號就是指針!我們把X換做是內存,每棟房子看成一個獨立的內存空間,那麼就可以這麼下結論,一個指針就是值為其他內存對象地址的數據類型。
指針的本質:
其實指針的本質是對內存地址的抽象,抽象內存地址的方式有多種,只要你能通過一種方式達到對內存對象進行訪問,那麼這種方式就可以叫做指針。比如,我要找1個人,我通過電話本上的號碼找到他,這時,這個電話號碼叫指針(電話本叫指針變量)。又比如,我通過GPS找到他的地址坐標找到他,那麼這個地址坐標叫指針(這個GPS叫做指針變量)。
指針變量:
存放一個值為其他內存對象地址的變量叫指針變量。
指針變量的聲明要點:
如果我們申明一個指針變量 int *p,但是剛開始我們還無法確定需要給p什麼值的時候我們必須給p賦值NULL; NULL的實質是這樣的:#define NULL ((void *)0) 強制轉換的0.因為指針變量在debug環境下默認初始值是全C,release環境下是上次廢棄的值。
指針與地址的區別:
地址是表示內存的編號信息;指針有2個信息,1個是地址信息,1個是此地址的解釋信息。比如:int *p表示此指針指向的地址的內存對象用int去解析.float *q表示此指針指向的地址的內存對象用float去解析。
C語言的直接引用:
我們通過變量名來直接引用變量。例如a=123.編譯器會自動將變量名轉換成變量的存儲地址。然後再將123放入變量a的存儲空間中。
C語言的間接引用:
首先將變量的地址存放在一個變量(指針變量),然後再通過存放變量的地址的指針變量來引用變量。
直接引用和間接引用的代碼事例:
#include <stdio.h>void main(){ int a, b; int *p;//定義指針變量p p = &b;//將變量b的地址存放在變量p中 a = 3;//直接引用變量a *p = 5;//間接引用變量b}
關於間接引用的回憶:
大家還記得我們前幾天我們學習的數組名傳參的內容嗎?我們看到復制過去的副本是數組的首地址。在我們的實現函數裡是針對這個地址再尋址。
關於數組名的思維的發散:
我們能不能對數組名取地址呢?!
其實對數組名取地址是沒有意義的。數組名是一個地址常量,比如123,321這樣的常量在內存中是沒有內存空間的。只有變量才有內存空間。常量被集成到指令裡,沒有專門保存它們的內存空間。
為什麼常量進行函數傳參時常量會有內存空間呢?!
比如:go(123).因為這個時候需要有個副本來保存參數。
嚴格來說,只要程序運行起來了,都要占空間。只是常量沒有占到數據保存的區域裡,而是集成到指令裡去了。