C語言基礎:地址與指針

從這一節開始我們要學習C語言中最重要的一個機制——指針。指針是C語言的靈魂。想要學好指針,我們就要先從內存地址學起。

一、內存地址

內存,實際上一可以存放很多位元組數據的一個內部存儲器。每一個存儲單元為8個bit位,也就是一個位元組byte,簡寫為B。這樣多個存儲單元線性的排列在一起,就構成了一定大小的存儲空間。1024個位元組為1KB,1024KB為1MB,而1024MB為1GB,1024GB為1TB等等。其實內存的本質就是由這樣很多個位元組所組成的存儲單元。

為了能讓程序能夠有效的訪問這些內存,計算機為內存中的每一個位元組進行編號,從0開始依次排列下去,這些編號是連續的,線性的,例如:

這些為內存所編寫的編號稱為內存地址。在32位架構下計算機只有32根內存地址匯流排,所以CPU只能使用

也就是4GB的內存地址,而在64位架構下計算機有64根內存地址匯流排所以能最後最多使用

的內存地址。在32位系統下內存地址變數佔4個位元組,而64位系統下內存地址佔8個位元組。

二、指針變數

接下來我們來看看指針變數,我們訪問內存地址時,需要根據其內存地址來訪問其所在的內存內容。C語言中提供了這樣的方法可以通過內存地址來訪問內存的內容。與其它基本變數類型一樣,我們 可以定義一種指針類型的變數,這個所謂的指針就是一個普通變數,這個變數中存放的是一個內存地址,在定義指針變數時需要為其指針類型,例如:

char *p0;short *p1;int *p2;

也就是說char *p0表示的是一個指向字元型變數的指針,short *p1表示的是一個指向短整形的指針。int *p2表示的是指向一個整型變數的指針。注意在這三個變數p0、p1和p2都是指針型變數,它們所佔用的大小都是4個位元組(在64位架構下佔8個位元組)。他們都是指針型變數,只不過它們所表示的分別是:所指向的內存地址中存放的變數類型分別為字元型變數、短整型變數和整型變數。

我們可以通過&運算符對一個變數取其所在的內存地址,例如並同仁給相應的指針型變數,例如:

char ch = A;short sh = 12;int i = 234;char *p_ch = &ch;short *p_sh = &sh;int *p_i = &i;

這樣在指針變數p_ch中就存放了變數ch的內存地址,也就是通過&符可以將ch變數的所在的內存地址取出來再通過=同仁賦值賦值給p_ch變數,同樣p_sh中存放存入的是sh的地址,p_i中存放的是i的地址。得到這些內存地址之後就可以根據自己的需要對這個內存地址所在的變數做相應的操作,對地址取其變數的操作過程就是對變數取地址的逆操作,例如

char ch = A;short sh = 12;int i = 234;printf("%d %d %d
", ch, sh, i);char *p_ch = &ch;short *p_sh = &sh;int *p_i = &i;*p_ch = 1;*p_sh = 2;*p_i = 3;printf("%d %d %d
", ch, sh, i);65 12 2341 2 3

可以看到我們通過&取地址操作就會將這幾個變數的地址賦值給了指針變數,再通過*將指針變數取得變數操其內存地址區域的變數。

歡迎關注公眾號:編程外星人

推薦閱讀:

不太明白......[偶記]
從1+1到混沌 | Mathematica系列教程·第一集
採礦--編碼與繼電器
【代碼日誌】unity常用邏輯中一個個「靈異現象」的原理記錄

TAG:編程 | C編程語言 | 編程語言 |