C語言:深入理解指針(1)

1. 內存和地址

??在了解指針前,我們需要知道內存和地址是什么。

1.1 內存

? ? ? ?首先來看內存。舉個例子:當你在酒店找房間時,你并不是一層一層一間一間找,而是通過酒店為每間房子設置的門牌號直接找到你的房間,這樣的效率就會快很多。

? ? ? ?把上面的例子投影到計算機中:CPU在處理數據的時候,需要在內存中取數據,處理后的數據又會放回到內存中。內存空間管理時就會把內存劃分為一個個內存單元,每個內存單元大小設置為一字節。每個內存單元也有其相應的編號,這樣CPU就可以通過編號快速找到一個內存單元。這個編號在計算機中我們稱它為地址。C語言中給地址起了個新的名字,叫指針。因此我們可以理解為:內存單元的編號==地址==指針

1.2 如何理解編址

? ? ? ?首先,需要知道,計算機內部是有很多硬件單元的,各個硬件單元相互工作時是通過“線”連接起來的。而CPU和內存之間也是有?量的數據交互的,所 以,兩者必須也?線連起來。我們今天只關心地址總線(還有數據總線和控制總線)。當CPU在訪問某個內存單元時,必須知道該內存單元在哪個位置,因此需要給每個內存單元進行編址。

? ? ? ?計算機中的編址,并不是把每個字節的地址記錄 下來,?是通過硬件設計完成的。就像吉他和鋼琴等樂器一樣,琴弦和鋼琴鍵上并沒有標注 do、re、mi......。但是演奏者總能精準地找到在什么位置,這是大家約定俗成的。

? ? ? ?硬件編制也是如此,32位機器就有32根地址總線,每一位都有 0 和 1 兩種結果,32根像就能表示出 2 的 32 次方種結果,每一種排列都表示一個地址,64位機器以此類推。地址信息被下達給內存,在內存上,就可以找到 該地址對應的數據,將數據在通過數據總線傳? CPU內寄存器。

2.指針變量和地址

2.1 取地址操作符(&)

? ? ? ?在C語言中創建變量的本質就是向內存申請空間。如圖:

? ? ? ? 右下角的內存中 & 為取地址操作符,圖中為取出 x 的地址,是一個單目操作符。我們之前學的 a&b 表示 a 按位與 b ,兩者不一樣。上述代碼就是創建了一個整型變量 x ,在內存中申請了 4 個字節用來存放 4。當我們打印 x 的地址時,就會發現這個內存單元中正好存放的是 4。

2.2 指針變量和解引用操作符

2.2.1指針變量

? ? ? ? 我們通過取地址操作符(&)得到一個變量的地址,我們通過指針變量將它存放起來,便于使用例如:

#include <stdio.h>
int main()
{int x = 4;int * p = &x;//取出x的地址放到指針變量p中return 0;
}

? ? ? ? 指針變量也是一種變量,只不過讓它是用來存放地址的,變量中的值都是地址。

2.2.2 如何理解指針變量

? ? ? ? 剛剛的定義的 int * p 中,* 說明 p 是一個指針變量,int 表示 p 指向的的類型是整型。同理如果有個 char、double、等類型的變量,他們的地址就要分別放在 char*、double* 中。

2.2.3 解引用操作符

? ? ? ? 我們將地址存起來肯定是要使用的,使用時我們就會用到解引用操作符(*)。

? ? ? ? 上圖中就使用了解引用操作符我們通過 *p 找到了 x 并且修改了 x 的值,我們修改時并沒有寫 x = 0 ,而是直接通過指針變量來修改,即 *p=0 ,這樣寫代碼時會更加靈活。

2.3 指針變量的大小

? ? ? ??32位機器有32根地址總線,那么它就需要 4 個字節來存儲地址(1個字節 8 個比特位,4個字節剛好 32 個比特位),同理 64 位機器則需要 8 個字節來存儲地址。同時我們要注意指針變量的大小和類型是無關的,只要指針類型的變量,在相同的平臺下,大小都是相同的。不管指針變量是? char 還是 int ,他們在32位機器下都是 4 個字節,在 64 位機器下都是 8 個字節。

3.指針變量類型的意義

3.1指針的解引用

? ? ? ? 讓我們來對比下面兩段代碼:

? ? ? ? ?我們發現 int* 和 char* 修改的字節不同,因此:指針的類型決定了對指針解引用的時候有多大的權限(?次能操作?個字節)。 ?如?char* 的指針解引用就只能訪問一個字節,而 int* 的指針的解引?就能訪問四個字節。

3.2 指針+-整數

? ? ? ? 同樣的,對指針+-時,不同的指針變量的類型所移動的距離也不同。若對 int* 進行+/-1時,會一次移動四個字節,而對 char* 進行+/-1時則一次移動一個字節。

3.3 void*指針

? ? ? ? ?void* 表示無具體類型的指針。這種類型的指針可以接受任意類型的地址,但是我們不能直接對這種類型的指針進行+/-整數和對指針的解引用,需要進行強制類型轉換。?般 void* 類型的指針是使?在函數參數的部分,?來接收不同類型數據的地址,這樣的設計可以實現泛型編程的效果。使得?個函數來處理多種類型的數據。

4.指針運算

4.1 指針+-整數

? ? ? ? 數組在內存中是連續存放的,因此只要知道第?個元素的地址后,我們可以通過加減操作來獲取后面的所有元素。

4.2 指針-指針

? ? ? ??

? ? ? ?由圖可得,指針-指針所得帶的結果是兩個指針之間的元素個數,但前提是這兩個指針指向的是同一塊內存空間。

? ? ? ?另外,指針也能進行關系運算。

? ? ? ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915827.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915827.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

完整的 SquareStudio 注冊登錄功能實現方案:已經燒錄到開發板正常使用

根據你的需求&#xff0c;我將提供完整的實現方案&#xff0c;解決按鈕同時執行多個動作的問題&#xff0c;并確保注冊登錄功能正常工作。所需文件結構需要創建和修改的文件如下&#xff1a;ui_events.h - 事件處理函數聲明events.c - 實際的事件處理邏輯ui.c - UI 初始化和事件…

OkHttp 與 Chuck 結合使用:優雅的 Android 網絡請求調試方案

前言在 Android 應用開發過程中&#xff0c;網絡請求調試是日常工作中不可或缺的一部分。Chuck 是一個輕量級的 OkHttp 攔截器&#xff0c;能夠在應用內直接顯示網絡請求和響應的詳細信息&#xff0c;無需連接電腦或使用額外工具。本文將詳細介紹如何將 OkHttp 與 Chuck 結合使…

AI學習--本地部署ollama

AI小白&#xff0c;記錄下本地部署ollama1.下載安裝ollama下載地址ollama官方地址https://ollama.com/download根據系統下載即可下面是我下載的地址 https://release-assets.githubusercontent.com/github-production-release-asset/658928958/e8384a9d-8b1e-4742-9400-7a0ce2a…

docker 設置鏡像倉庫代理

1. 創建 Docker 服務的代理配置文件sudo mkdir -p /etc/systemd/system/docker.service.d2.創建文件 /etc/systemd/system/docker.service.d/http-proxy.conf&#xff0c;內容如下&#xff1a;[Service] Environment"HTTP_PROXYhttp://192.168.0.111:7890" Environme…

ffmpeg rtsp 丟包處理

直接用 demux 在有些網絡中&#xff0c;丟包畫屏&#xff1b; 再ffmpeg和ffplay中&#xff0c;可以指定 tcp 方式&#xff0c;所以代碼直接設置陶瓷坯方式&#xff1b; // 設置RTSP選項優化接收數據流防止數據包丟失 av_dict_set(&options, "rtsp_transport", …

aosp15實現SurfaceFlinger的dump輸出帶上Layer詳細信息踩坑筆記

背景&#xff1a; 針對上一篇文章 aosp15上SurfaceFlinger的dump部分新特性-無Layer信息輸出如何解決&#xff1f; 給大家布置了一個小作業&#xff0c;那就是需要實現dumpsys SurfaceFlinger相關輸出中可以攜帶上所有的Layer的詳細信息需求&#xff0c;今天來帶大家詳細實現一…

Linux 網絡調優指南:廢棄的 tcp_tw_recycle 與安全替代方案

一、問題起源:消失的內核參數 當你在 Debian 10 系統執行 sysctl 命令時,若看到報錯: sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: 沒有那個文件或目錄 這并非配置錯誤,而是Linux 內核演進的結果。自 4.12 版本起,內核正式移除了 tcp_tw_recycle 參數——…

刪除有序數組中的重復項

class Solution {public int removeElement(int[] nums, int val) {// 暴力法int n nums.length;for (int i 0; i < n; i) {if (nums[i] val) {for (int j i 1; j < n; j) {nums[j - 1] nums[j];}i--;n--;}}return n;} }代碼邏輯解析首先獲取數組長度n&#xff0c;…

【Pytest】從配置到固件的使用指南

掌握高效測試的關鍵技巧&#xff0c;打造專業級自動化測試框架一、Pytest框架的核心優勢 Pytest作為Python最強大的測試框架之一&#xff0c;以其簡潔靈活的語法和豐富的擴展能力深受開發者喜愛。相比unittest&#xff0c;Pytest提供了更直觀的測試編寫方式和更強大的功能集&am…

[matlab]matlab上安裝xgboost安裝教程簡單版

【前言】 網上基于MATLAB的xgboost安裝教程太少了&#xff0c;以至于幾乎搜不到&#xff0c;為此做了一個簡單安裝教程【安裝前提】 有matlab軟件&#xff0c;版本越高越好&#xff0c;我用的是2023a。理論支持matlab2018a及其以上&#xff0c;因此需要自己提前安裝好matlab【安…

基于多種機器學習的成都市二手房房價分析與價格預測【城市可換、算法模型多種對比】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目背景數據來源與采集方式數據預處理與清洗流程探索性數據分析&#xff08;EDA&#xff09;模型構建與預測方法項目意義與應用前景相關可視化展示總結每文一語有需要本項目的代碼或文檔以及…

PostgreSQL 事務ID環繞問題

事務ID&#xff08;XID&#xff09;基本概念 從Transactions and Identifiers可知&#xff1a; 事務 ID&#xff0c;例如 278394&#xff0c;會根據 PostgreSQL 集群內所有數據庫使用的全局計數器按順序分配給事務。此分配會在事務首次寫入數據庫時進行。這意味著編號較低的 x…

高等數學-矩陣知識

好的&#xff0c;我們來詳細講解高等數學&#xff08;主要是線性代數部分&#xff09;中的核心矩陣知識。矩陣是線性代數的基石&#xff0c;廣泛應用于數學、物理、工程、計算機科學、經濟學等眾多領域。 一、矩陣的基本概念定義&#xff1a; 一個 m n 矩陣 (Matrix) 是一個由…

React 項目性能優化概要

應用級性能優化&#xff0c;需要結合實際需求展開分析&#xff0c;通常我們需要從以下幾個方面來考慮&#xff1a; 1. 識別性能瓶頸 識別性能瓶頸是優化的第一步&#xff0c;通過各種工具和方法找到影響性能的主要原因&#xff1a; React Profiler&#xff1a;使用 React Dev…

【web自動化】-5- fixture集中管理和項目重構

一、投標用例設計 # 定義讓前臺頁面保持自動登錄的fixture pytest.fixture() def user_driver():driver webdriver.Chrome()driver.get("http://47.107.116.139/fangwei/")driver.maximize_window()# 創建頁面類對象page ReceptionLoginPage(driver)# 通過頁面類對…

Dify工作流:爬蟲文章到AI知識庫

部署Dify 代碼拉取 git clone https://github.com/langgenius/dify.git cd dify/docker啟動容器 docker-compose up -d啟動成功準備知識庫 創建知識庫 創建一個空的知識庫要先從網址中&#xff0c;找到這個知識庫的id&#xff0c;記下后面需要用到。新建API密鑰 創建密鑰&#…

支付鑒權方案介紹

前后端交互中的鑒權是確保請求來源合法、身份可信、權限合適的關鍵手段。不同系統架構和業務類型下,使用的鑒權方式略有不同,但主要可分為以下幾類: ? 一、前后端交互常見的鑒權方式概覽 鑒權方式 優點 缺點 適用場景 Cookie + Session 簡單、成熟,服務端易控制 不適合跨域…

halcon處理灰度能量圖

使用halcon處理射線圖像&#xff0c;對高能區域和低能區域分割處理感興趣區域&#xff0c;篩選區域下的灰度值區間范圍。圖像灰度值為16位深度圖。* 讀取灰度圖像 read_image (Image, /123.tif)** 獲取圖像尺寸 get_image_size (Image, Width, Height)* 分割圖像為左右兩部分&a…

Oracle From查看彈性域設置

打開彈性與設置&#xff1a;【應用開發員->彈性域->說明性->段】打開后界面如下&#xff1a; 把光標定位到標題&#xff0c;然后點擊“手電筒”搜索名稱&#xff08;名稱就是你要查詢的那個彈性域的名稱&#xff09;我這里就是搜索“附加題頭信息”&#xff0…

git初始流程

對于一個新項目&#xff0c;從 Git 倉庫拉取 test_tool 分支并進行后續修改提交的完整流程如下&#xff1a; 一、首次拉取項目&#xff08;克隆倉庫并切換分支&#xff09;克隆遠程倉庫到本地 打開終端&#xff08;或 PyCharm 的 Terminal&#xff09;&#xff0c;進入你想存放…