一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C 語言指針概念的詳解

C 語言指針概念的詳解

2021-04-14 13:37C語言教程網 C/C++

這里主要介紹C 語言指針,這里整理了詳細的資料,對指針做了詳細說明及簡單示例代碼幫助大家理解什么是指針,有興趣的小伙伴可以參考下

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

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

C 語言指針概念的詳解

我們將內存中字節的編號稱為地址(Address)或指針(Pointer)。地址從 0 開始依次增加,對于 32 位環境,程序能夠使用的內存為 4GB,最小的地址為 0,最大的地址為 0XFFFFFFFF。

下面的代碼演示了如何輸出一個地址:

?
1
2
3
4
5
6
7
#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語言的指針做了詳細介紹,后續繼續補充相關資料,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 好爽视频 | 午夜影院免费入口 | 久久噜国产精品拍拍拍拍 | 国产福利视频一区二区微拍视频 | 新版孕妇bbwbbwbbw | 456在线观看 | 欧美高清在线精品一区二区不卡 | 很黄的网站在线观看 | 亚洲看片lutube在线入口 | 欧美三级小视频 | 欧美日韩亚洲另类人人澡 | 天天夜夜草草久久伊人天堂 | beeg日本高清xxxx18 | 91制片厂制作果冻传媒123 | www.亚洲色图 | 国人精品视频在线观看 | 国产123区在线视频观看 | 图片专区亚洲欧美另类 | 十大免费b2b网站 | 天天草b | 亚洲精品午夜视频 | 喘息揉弄1v1h老师 | 国产99视频精品免视看7 | 欧美一级视| 日本亚洲欧洲高清有码在线播放 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 小浪妇奶真大水多 | 精品国产在天天线在线麻豆 | 驯服有夫之妇HD中字日本 | 亚洲精品国产自在现线最新 | 成人欧美1314www色视频 | 国产欧美综合一区二区 | 国产一级一级一级成人毛片 | 无码区国产区在线播放 | 女人肮脏的交易中文字幕未删减版 | 欧美一区二区三区精品 | 外国老少性配 | 女人被男人躁得好爽免费视频 | 1986葫芦兄弟全集免费观看第十集 | 国产一区日韩二区欧美三区 | 亚洲精品久久久久AV无码 |