日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一文扒開C語言指針神秘的外衣,指針也不過如此嘛

指針是 C 語言的靈魂,指針可以直接操作內存,指針使C程序更加高效,等等等等。相信 C 語言初學者學到指針時,會看到很多這樣描述指針的話,但是卻往往一頭霧水。所以,本節(jié)不會一上來就直接說指針,但是相信我,看完本節(jié),你一定會覺得 C 語言的指針也不過如此,沒那么神秘。

上一節(jié)介紹了 C 語言中的數(shù)據(jù)類型,提到不同的數(shù)據(jù)類型的主要區(qū)別在于占用的存儲空間不同。我們知道,C 程序是運行在計算機的內存中的,因此 C 程序的變量也是存在于內存中的。C 標準規(guī)定 char 類型占用一個字節(jié)的存儲空間,對其他整型卻沒有做規(guī)定,現(xiàn)在為了解釋的方便,我們假設 int 類型的數(shù)據(jù)占用內存 4 個字節(jié)。

假設我們如下定義了兩個變量:

 
 
 
 
  1. signed char i = 3; 
  2. int j = 8;

那么,i 占用了 1 字節(jié)的內存空間,j 占用了 4 字節(jié)的內存空間,請看下圖。

方框表示內存空間,內部表示存儲的值。我們把內存逐字節(jié)編號,方框外部的數(shù)字表示方框的編號(這樣的內存“編號”即所謂的“內存地址”)。修改變量 i 的值,實際上就是修改地址為 4000 的內存空間里的值。那反過來呢?如果我修改了地址為 4000 的內存空間里的值,i 的值會相應改變嗎?答案是肯定的,請繼續(xù)往下看。

上圖中的內存地址“4000”是我為了解釋方便隨意取的。那么,在實際應用中,變量 i 的地址如何獲取呢?C 語言提供了“&”運算符,就是獲取變量地址的。請看下面的例子:

 
 
 
 
  1. #include  
  2. int main() 
  3.  signed char i = 3; 
  4.  int j = 8; 
  5.  long p1 = (long)&i; 
  6.  printf("p1: %ld 
  7. ", p1); 
  8.  return 0; 
  9. }

我們取出了 i 的地址,把它強制轉換為 long 型(關于強制類型轉換,可參考上一節(jié)),傳遞給 p1 了。編譯執(zhí)行,發(fā)現(xiàn)變量 i 的地址被打印出來了。這說明,C 程序變量的地址也是一個整數(shù)。

按照上面的說法,修改 i 的值除了直接對 i 賦值以外,還可以通過修改 p1 地址處的內存空間里的數(shù)值。那,怎樣才能“通過修改 p1 地址處的內存空間里的數(shù)值”修改 i 的值呢?

上面的代碼實例中,我們使用了 long 型變量 p1 存儲了 i 的地址。事實上,C 語言有專門的數(shù)據(jù)類型存儲地址,定義方式也很簡單,就是:“類型描述符 * ”,例如,可以定義以下變量存儲地址:

 
 
 
 
  1. signed char *p1 = &i; 
  2. int *p2 = &j;

p1 和 p2 就是 C 語言中所謂的指針類型,因為 i 是 signed char 類型的,所以定義了 signed char * 類型的指針存儲 i 的地址。j 是 int 類型的,所以定義了 int * 類型的指針存儲 j 的地址。另外,C 語言提供了“&”運算符取變量地址,與之對應的,還提供了“ * ”運算符從相應地址內存里取出數(shù)值。

好了,了解了 C 語言的指針類型和“ * ”運算符,現(xiàn)在來看看如何“通過修改 p1 地址處的內存空間里的數(shù)值”修改 i 的值。請看如下代碼:

 
 
 
 
  1. signed char *p1 = &i; 
  2. *p1 = 5; 
  3. printf("i=%d 
  4. ", i);

編譯運行,發(fā)現(xiàn)程序輸出“i=5”,這樣我們就實現(xiàn)了“通過修改 p1 地址處的內存空間里的數(shù)值”修改 i 的值。

在定義變量時,” * “放在變量符號前,可以定義指針變量。在定義完指針變量后,“ * ”放在變量前,就表示從地址取值的運算符了。另外,“ * ”還可以表示乘法運算符,讀者自己思考什么情況下,“ * ”表示乘法運算符。

以上的操作,實際上就是 C 語言的指針操作,可以看出它一點也不神秘,接下來幾節(jié),我們將繼續(xù)討論 C 語言的指針,比如為什么 int 類型的變量 j 的地址要使用 int* p2; 定義,而不能使用 signed char* p2; 定義,使用指針為何能寫出緊湊、高效的 C 程序等等。

歡迎在評論區(qū)一起討論,質疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言,喜歡我的文章就關注一波吧,可以看到***更新和之前的文章哦。


本文標題:一文扒開C語言指針神秘的外衣,指針也不過如此嘛
URL鏈接:http://www.5511xx.com/article/cojccdi.html