自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文扒開C語言指針神秘的外衣,指針也不過如此嘛

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

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

[[253871]]

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

假設(shè)我們?nèi)缦露x了兩個(gè)變量: 

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

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

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

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

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

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

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

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

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

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

[[253874]]

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

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

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

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

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

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

責(zé)任編輯:龐桂玉 來源: 今日頭條
相關(guān)推薦

2025-04-28 01:22:45

2024-02-01 11:57:31

this指針代碼C++

2023-07-04 08:56:07

指針類型Golang

2021-09-09 17:05:36

C++智能指針語言

2020-12-29 08:02:37

SqlSession 程序Executor

2021-01-13 06:58:35

C語言函數(shù)指針

2020-05-21 08:24:17

阿里SQL查詢

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

2021-02-18 15:43:37

Python裝飾器Decorator

2009-06-30 10:46:05

多級(jí)指針

2021-12-06 11:19:47

語言指針內(nèi)存

2023-10-27 11:21:20

C語言Multics語言

2022-01-06 14:25:24

C語言指針內(nèi)存

2009-01-08 09:26:06

C語言指針類型

2020-09-23 16:55:43

C語言編程語言

2018-06-05 11:18:18

2021-08-06 13:48:53

C語言野指針內(nèi)存

2014-08-01 15:16:05

SwiftC語言

2024-11-11 16:36:41

2021-08-11 09:01:48

智能指針Box
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)