程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C 說話指針概念的詳解

C 說話指針概念的詳解

編輯:關於C++

C 說話指針概念的詳解。本站提示廣大學習愛好者:(C 說話指針概念的詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C 說話指針概念的詳解正文


盤算機中一切的數據都必需放在內存中,分歧類型的數據占用的字節數紛歧樣,例如 int 占用4個字節,char 占用1個字節。為了准確地拜訪這些數據,必需為每一個字節都編上號碼,就像門商標、身份證號一樣,每一個字節的編號是獨一的,依據編號可以精確地找到某個字節。

下圖是 4G 內存中每一個字節的編號(以十六進制表現):

我們將內存中字節的編號稱為地址(Address)或指針(Pointer)。地址從 0 開端順次增長,關於 32 位情況,法式可以或許應用的內存為 4GB,最小的地址為 0,最年夜的地址為 0XFFFFFFFF。

上面的代碼演示了若何輸入一個地址:

#include <stdio.h>
int main(){
 int a = 100;
 char str[20] = "c.biancheng.net";
 printf("%#X, %#X\n", &a, str);
 return 0;
}

運轉成果:

0X28FF3C, 0X28FF10

%#X表現以十六進制情勢輸入,並附帶前綴0X。a 是一個變量,用來寄存整數,須要在後面加&來取得它的地址;str 自己就表現字符串的首地址,不須要加&。

一切都是地址

C說話用變量來存儲數據,用函數來界說一段可以反復應用的代碼,它們終究都要放到內存中能力供 CPU 應用。

數據和代碼都以二進制的情勢存儲在內存中,盤算機沒法從格局上辨別某塊內存究竟存儲的是數據照樣代碼。當法式被加載到內存後,操作體系會給分歧的內存塊指定分歧的權限,具有讀取和履行權限的內存塊就是代碼,而具有讀取和寫入權限(也能夠只要讀取權限)的內存塊就是數據。

CPU 只能經由過程地址來獲得內存中的代碼和數據,法式在履行進程中會告訴 CPU 要履行的代碼和要讀寫的數據的地址。假如法式不當心失足,或許開辟者成心為之,在 CPU 要寫入數據時給它一個代碼區域的地址,就會產生內存拜訪毛病。這類內存拜訪毛病會被硬件和操作體系攔阻,強迫法式瓦解,法式員沒有搶救的機遇。

CPU 拜訪內存時須要的是地址,而不是變量名和函數名!變量名和函數名只是地址的一種助記符,當源文件被編譯和鏈接成可履行法式後,它們都邑被調換成地址。編譯和鏈接進程的一項主要義務就是找到這些稱號所對應的地址。

假定變量 a、b、c 在內存中的地址分離是 0X1000、0X2000、0X3000,那末加法運算c = a + b;將會被轉換成相似上面的情勢:

0X3000 = (0X1000) + (0X2000);

( )表現取值操作,全部表達式的意思是,掏出地址 0X1000 和 0X2000 上的值,將它們相加,把相加的成果賦值給地址為 0X3000 的內存

變量名和函數名為我們供給了便利,讓我們在編寫代碼的進程中可使用易於浏覽和懂得的英文字符串,不消直接面臨二進制地址,那場景的確讓人瓦解。

須要留意的是,固然變量名、函數名、字符串名和數組名在實質上是一樣的,它們都是地址的助記符,但在編寫代碼的進程中,我們以為變量名表現的是數據自己,而函數名、字符串名和數組名表現的是代碼塊或數據塊的首地址。

關於法式內存、編譯鏈接、可履行文件的構造和若何找到稱號對應的地址,我們將在《C說話內存》和《C說話模塊化開辟》專題中深刻商量。

 以上就是 對C說話的指針做了具體引見,後續持續彌補相干材料,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved