欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C 語言指針概念的詳解

 更新時間:2016年08月23日 09:10:58   投稿:lqh  
這里主要介紹C 語言指針,這里整理了詳細的資料,對指針做了詳細說明及簡單示例代碼幫助大家理解什么是指針,有興趣的小伙伴可以參考下

計算機中所有的數據都必須放在內存中,不同類型的數據占用的字節(jié)數不一樣,例如 int 占用4個字節(jié),char 占用1個字節(jié)。為了正確地訪問這些數據,必須為每個字節(jié)都編上號碼,就像門牌號、身份證號一樣,每個字節(jié)的編號是唯一的,根據編號可以準確地找到某個字節(jié)。

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

我們將內存中字節(jié)的編號稱為地址(Address)或指針(Pointer)。地址從 0 開始依次增加,對于 32 位環(huán)境,程序能夠使用的內存為 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 使用。

數據和代碼都以二進制的形式存儲在內存中,計算機無法從格式上區(qū)分某塊內存到底存儲的是數據還是代碼。當程序被加載到內存后,操作系統會給不同的內存塊指定不同的權限,擁有讀取和執(zhí)行權限的內存塊就是代碼,而擁有讀取和寫入權限(也可能只有讀取權限)的內存塊就是數據。

CPU 只能通過地址來取得內存中的代碼和數據,程序在執(zhí)行過程中會告知 CPU 要執(zhí)行的代碼以及要讀寫的數據的地址。如果程序不小心出錯,或者開發(fā)者有意為之,在 CPU 要寫入數據時給它一個代碼區(qū)域的地址,就會發(fā)生內存訪問錯誤。這種內存訪問錯誤會被硬件和操作系統攔截,強制程序崩潰,程序員沒有挽救的機會。

CPU 訪問內存時需要的是地址,而不是變量名和函數名!變量名和函數名只是地址的一種助記符,當源文件被編譯和鏈接成可執(zhí)行程序后,它們都會被替換成地址。編譯和鏈接過程的一項重要任務就是找到這些名稱所對應的地址。

假設變量 a、b、c 在內存中的地址分別是 0X1000、0X2000、0X3000,那么加法運算c = a + b;將會被轉換成類似下面的形式:

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

( )表示取值操作,整個表達式的意思是,取出地址 0X1000 和 0X2000 上的值,將它們相加,把相加的結果賦值給地址為 0X3000 的內存

變量名和函數名為我們提供了方便,讓我們在編寫代碼的過程中可以使用易于閱讀和理解的英文字符串,不用直接面對二進制地址,那場景簡直讓人崩潰。

需要注意的是,雖然變量名、函數名、字符串名和數組名在本質上是一樣的,它們都是地址的助記符,但在編寫代碼的過程中,我們認為變量名表示的是數據本身,而函數名、字符串名和數組名表示的是代碼塊或數據塊的首地址。

關于程序內存、編譯鏈接、可執(zhí)行文件的結構以及如何找到名稱對應的地址,我們將在《C語言內存》和《C語言模塊化開發(fā)》專題中深入探討。

 以上就是 對C語言的指針做了詳細介紹,后續(xù)繼續(xù)補充相關資料,謝謝大家對本站的支持!

相關文章

  • 關于C++ string和c類型字符數組的對比

    關于C++ string和c類型字符數組的對比

    下面小編就為大家?guī)硪黄P于C++ string和c類型字符數組的對比。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • C語言實現三子棋實例代碼

    C語言實現三子棋實例代碼

    大家好,本篇文章主要講的是C語言實現三子棋實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++ 使用CRC32檢測內存映像完整性的實現步驟

    C++ 使用CRC32檢測內存映像完整性的實現步驟

    當我們使用動態(tài)補丁的時候,那么內存中同樣不存在校驗效果,也就無法抵御對方動態(tài)修改機器碼了,為了防止解密者直接對內存打補丁,我們需要在硬盤校驗的基礎上,增加內存校驗,防止動態(tài)補丁的運用。
    2021-06-06
  • C語言實例之雙向鏈表增刪改查

    C語言實例之雙向鏈表增刪改查

    雙向鏈表(Doubly Linked List)是一種常見的數據結構,在單鏈表的基礎上增加了向前遍歷的功能,與單向鏈表不同,雙向鏈表的每個節(jié)點除了包含指向下一個節(jié)點的指針外,還包含指向前一個節(jié)點的指針,本文給大家介紹了C語言中雙向鏈表的增刪改查
    2023-08-08
  • C++中Covariant返回值類型詳解

    C++中Covariant返回值類型詳解

    這篇文章主要介紹了C++中Covariant返回值類型詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以可以參考一下
    2022-09-09
  • C語言實現哈夫曼樹的構建

    C語言實現哈夫曼樹的構建

    這篇文章主要為大家詳細介紹了C語言實現哈夫曼樹的構建,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 基于OpenGL實現多段Bezier曲線拼接

    基于OpenGL實現多段Bezier曲線拼接

    這篇文章主要為大家詳細介紹了基于OpenGL實現多段Bezier曲線拼接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言實現二叉樹層次遍歷介紹

    C語言實現二叉樹層次遍歷介紹

    大家好,本篇文章主要講的是C語言實現二叉樹層次遍歷介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • VC中使用ADO開發(fā)數據庫應用程序簡明教程

    VC中使用ADO開發(fā)數據庫應用程序簡明教程

    這篇文章主要介紹了VC中使用ADO開發(fā)數據庫應用程序的方法,結合實例形式詳細講述了ADO的原理及VC使用ADO開發(fā)數據庫應用程序的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 一文讀懂c++之static關鍵字

    一文讀懂c++之static關鍵字

    這篇文章主要介紹了c++之static關鍵字的的相關資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06

最新評論