C語言學習記錄——深入理解指針(4)

? ? ?OK,這一篇主要是講我學習的3種指針類型。

正文開始:

一.字符指針

? ? 所謂字符指針,顧名思義就是指向字符的指針。一般寫作? " char* "

直接來說說它的使用方法吧:

(1)一般使用情況:

int main()
{char a = 'A';char* p = &a;//取出a的地址printf("%c\n", *p);return 0;
}

打印結果:

(2)特殊使用情況:

int main()
{char s[] = "hello world";const char* p = s;printf("%s\n", p);return 0;
}

先看看運行情況:

這里是創建了一個字符數組寫的字符串,然后用p接收了字符串首字符的地址。? 注意喔,這里不是p接收了整個字符串的地址,這里打印出整個字符串容易讓人誤會是p接收了整個字符串的地址,實際上是因為打印字符串有首元素的地址就可以全部打印了。

驗證一下:

這里就可以看出,這里p和字符串首元素的地址是一模一樣的

好的,字符指針結束。
?

二.數組指針

? ?我之前還學習過指針數組,剛開始經常把它與數組指針搞混淆,這兩者是完全不一樣的,指針數組是存放指針的數組,而數組指針是指向數組的指針。也就是說,數組指針是指針變量

我們已經熟悉:

? 整形指針變量: int * pint; 存放的是整形變量的地址,能夠指向整形數據的指針。

? 浮點型指針變量: float * pf; 存放浮點型變量的地址,能夠指向浮點型數據的指針。

那數組指針變量應該是:存放的應該是數組的地址,能夠指向數組的指針變量。

? ?

答案是第二個,因為在第一個語句中? []? 的優先級比? ?*? ?更高 ,會優先與p1結合,所以必須用()像(*p2)這樣括在一起。那么p2先和*結合,說明p2是?個指針變量,然后指針指向的是?個??為10個整型的數組。所以p2是 ?個指針,指向?個數組,叫 數組指針。

好的,接下來介紹一下數組指針的用法。

(1)數組指針的初始化:

int main()
{int arr[10] = { 0 };&arr;//取出arr的地址。int (*p)[10] = &arr;return 0;
}

這里就取出了整個數組的地址(&arr)保存到數組指針 p 中

我們調出監視查看:

可以發現arr和p的類型是完全一樣的。

那我們就可以得到下面的結論:

(2)二維數組傳參的本質

?? 知道了數組指針的概念,就可以講一下數組傳參的本質了。

我之前寫二維數組傳參代碼是這樣寫的:

void func(int arr[3][5], int r, int c)
{int i = 0;for (i = 0;i < r;i++){int j = 0;for (j = 0;j < c;j++){printf("%d ", arr[i][j]);}printf("\n");}
}int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };func(arr, 3, 5);return 0;
}

可以看到形參接收的時候也是使用(arr[3][5])這樣的二維數組的形式來接受的,那當我學習了數組名是數組首元素的地址和數組指針后我知道了一種新的寫法。

?先我們再次理解?下?維數組,?維數組其實可以看做是每個元素是?維數組的數組,也就是?維數組的每個元素是?個?維數組。那么?維數組的?元素就是第??,是個?維數組

如下圖:

所以,根據數組名是數組?元素的地址這個規則,?維數組的數組名表?的就是第??的地址,是? 維數組的地址。根據上?的例?,第??的?維數組的類型就是 int [5] ,所以第??的地址的類 型就是數組指針類型 int(*)[5] 。那就意味著?維數組傳參本質上也是傳遞了地址,傳遞的是第? ?這個?維數組的地址,那么形參也是可以寫成指針形式的。如下:

void func(int(*p)[5], int r, int c)
{int i = 0;for (i = 0;i < r;i++){int j = 0;for (j = 0;j < c;j++){printf("%d ", *(*(p+i)+j));}printf("\n");}
}int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };func(arr, 3, 5);return 0;
}

形參就用數組指針來接收,打印也用解引用地址來打印,

printf("%d ", *(*(p+i)+j));

這一行可能不太好理解,本人也沒那個能耐就用文字說清楚,不懂的朋友可以用AI去解釋,只要熟悉指針了,那還是很好理解的。

好的,數組指針就到這里。

三.函數指針

? ?接下來就是最后的函數指針了。

那么什么是函數指針變量呢? 根據前?學習整型指針,數組指針的時候,我們的類?關系,我們不難得出結論: 函數指針變量應該是?來存放函數地址的,未來通過地址能夠調?函數的。 那么函數是否有地址呢?

很簡單,做個測試就知道了。

測試出來函數果然也是有地址的,并且使用(函數名)和使用(&函數名)打印出來的地址是一樣的,這和數組有點像,但不同的是:? 數組名!= &數組名,但是?函數名==&函數名,也就是說,函數比數組還好記一點。

那么初始化函數指針的方式也就類比著數組的來:

int Add(int x, int y)
{return x + y;
}
int main()
{int(*pf1)(int, int) = Add;
int(*pf2)(int x, int y) = &Add;//x和y寫上或者省略都是可以的return 0;
}

這就把函數(Add)的地址保存到指針變量(pf)中了。

接下來是使用函數指針變量,畢竟初始化了肯定要使用一下的嘛。

int Add(int x, int y)
{return x + y;
}
int main()
{int(*pf3)(int, int) = Add;printf("%d\n", (*pf3)(2, 3));//使用函數指針來調用函數printf("%d\n", pf3(3, 5));//(*pf3)==pf3,不需要使用*符號return 0;
}

注意看我寫在代碼中的注釋,運行結果如下:

這下函數指針的調用也學會了。

四.最后

不知不覺寫了兩個多小時了,學習的時間過得很快,希望現在和未來學的技術都能夠讓我在以后獲得收獲吧。

應該……會的吧,管他呢,反正有問題就解決,人生不就是被問題堆起來的嘛,不出現問題人生反而會有些索然無味吧。

說多了也說偏了,總之謝謝大家的閱讀!

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

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

相關文章

springboot3+vue3融合項目實戰-大事件文章管理系統獲取用戶詳細信息-ThreadLocal優化

一句話本質 為每個線程創建獨立的變量副本&#xff0c;實現多線程環境下數據的安全隔離&#xff08;線程操作自己的副本&#xff0c;互不影響&#xff09;。 關鍵解讀&#xff1a; 核心機制 ? 同一個 ThreadLocal 對象&#xff08;如示意圖中的紅色區域 tl&#xff09;被多個線…

Nacos源碼—8.Nacos升級gRPC分析六

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 一.處理ClientChangedEvent事件 也就是同步數據到集群節點&#xff1a; public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…

設計雜談-工廠模式

“工廠”模式在各種框架中非常常見&#xff0c;包括 MyBatis&#xff0c;它是一種創建對象的設計模式。使用工廠模式有很多好處&#xff0c;尤其是在復雜的框架中&#xff0c;它可以帶來更好的靈活性、可維護性和可配置性。 讓我們以 MyBatis 為例&#xff0c;來理解工廠模式及…

AI與IoT攜手,精準農業未來已來

AIoT&#xff1a;農業領域的變革先鋒 在科技飛速發展的當下&#xff0c;人工智能&#xff08;AI&#xff09;與物聯網&#xff08;IoT&#xff09;的融合 ——AIoT&#xff0c;正逐漸成為推動各行業變革的關鍵力量&#xff0c;農業領域也不例外。AIoT 技術通過將 AI 的智能分析…

排錯-harbor-db容器異常重啟

排錯-harbor-db容器異常重啟 環境&#xff1a; docker 19.03 , harbor-db(postgresql) goharbor/harbor-db:v2.5.6 現象&#xff1a; harbor-db 容器一直restart&#xff0c;查看日志發現 報錯 initdb: error: directory "/var/lib/postgresql/data/pg13" exists…

Docker容器啟動失敗?無法啟動?

Docker容器無法啟動的疑難雜癥解析與解決方案 一、問題現象 Docker容器無法啟動是開發者在容器化部署中最常見的故障之一。盡管Docker提供了豐富的調試工具&#xff0c;但問題的根源往往隱藏在復雜的配置、環境依賴或資源限制中。本文將從環境變量配置錯誤這一細節問題入手&am…

查看購物車

一.查看購物車 查看購物車使用get請求。我們要查看當前用戶的購物車&#xff0c;就要獲取當前用戶的userId字段進行條件查詢。因為在用戶登錄時就已經將userId封裝在token中了&#xff0c;因此我們只需要解析token獲取userId即可&#xff0c;不需要前端再傳入參數了。 Control…

C/C++ 內存管理深度解析:從內存分布到實踐應用(malloc和new,free和delete的對比與使用,定位 new )

一、引言&#xff1a;理解內存管理的核心價值 在系統級編程領域&#xff0c;內存管理是決定程序性能、穩定性和安全性的關鍵因素。C/C 作為底層開發的主流語言&#xff0c;賦予開發者直接操作內存的能力&#xff0c;卻也要求開發者深入理解內存布局與生命周期管理。本文將從內…

使用Stable Diffusion(SD)中CFG參數指的是什么?該怎么用!

1.定義&#xff1a; CFG參數控制模型在生成圖像時&#xff0c;對提示詞&#xff08;Prompt&#xff09;的“服從程度”。 它衡量模型在“完全根據提示詞生成圖像”和“自由生成圖像”&#xff08;不參考提示詞&#xff09;之間的權衡程度。 數值范圍&#xff1a;常見范圍是 1 …

【GESP】C++三級練習 luogu-B2156 最長單詞 2

GESP三級練習&#xff0c;字符串練習&#xff08;C三級大綱中6號知識點&#xff0c;字符串&#xff09;&#xff0c;難度★★☆☆☆。 題目題解詳見&#xff1a;https://www.coderli.com/gesp-3-luogu-b2156/ 【GESP】C三級練習 luogu-B2156 最長單詞 2 | OneCoderGESP三級練…

Linux網絡基礎 -- 局域網,廣域網,網絡協議,網絡傳輸的基本流程,端口號,網絡字節序

目錄 1. 計算機網絡背景 1.1 局域網 1.1.2 局域網的組成 1.2 廣域網 1.1.2 廣域網的組成 2. 初始網絡協議 2.1 網絡協議的定義和作用 2.2 網絡協議的分層結構 2.2.1 OSI七層模型 2.2.2 TCP/IP 五層&#xff08;四層&#xff09;模型 3. 再識網絡協議 3.1 為什么要有…

【PostgreSQL】超簡單的主從節點部署

1. 啟動數據庫 啟動主節點 docker run --name postgres-master -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres啟動從節點 docker run --name postgres-slave -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres需要配置掛載的存儲卷 2. 數據…

c#修改ComboBox當前選中項的文本

對于一個C#的Combobox列表&#xff0c;類型設置為下拉樣式&#xff0c;不允許輸入&#xff0c;只能選擇&#xff0c;樣子如下&#xff1a; 該控件的名字為 cbb1&#xff0c;如果要修改當前這個“A1區”的文件&#xff0c;則用如下方式&#xff1a; cbb1.Items[cbb1.SelectedInd…

Java設計模式之適配器模式:從入門到精通

適配器模式(Adapter Pattern)是Java中最常用的結構型設計模式之一,它像一座橋梁連接兩個不兼容的接口,使得原本由于接口不兼容而不能一起工作的類可以協同工作。本文將全面深入地解析適配器模式,從基礎概念到高級應用,包含豐富的代碼示例、詳細注釋、使用場景分析以及多維對…

中國黃土高原中部XF剖面磁化率和粒度數據

時間分辨率&#xff1a;1000年 < x空間分辨率為&#xff1a;空共享方式&#xff1a;申請獲取數據大小&#xff1b;35.75 KB數據時間范圍&#xff1a;743-0 ka元數據更新時間&#xff1a;2023-08-15 數據集摘要 該數據集包括中國黃土高原中部XF剖面磁化率和粒度數據。將所有…

【Python訓練營打卡】day23 @浙大疏錦行

test pipeline管道 知識回顧: 1. 轉化器和估計器的概念 2. 管道工程 3. ColumnTransformer和Pipeline類 作業&#xff1a; 整理下全部邏輯的先后順序&#xff0c;看看能不能制作出適合所有機器學習的通用pipeline 偽代碼 # 適合所有機器學習的通用pipeline #偽代碼 import p…

【android bluetooth 框架分析 02】【Module詳解 13】【CounterMetrics 模塊介紹】

1. CounterMetrics 介紹 CounterMetrics 模塊代碼很少&#xff0c; 我簡單介紹一下。 // system/gd/metrics/counter_metrics.cc #define LOG_TAG "BluetoothCounterMetrics"#include "metrics/counter_metrics.h"#include "common/bind.h" #i…

QMK鍵盤固件配置詳解

QMK鍵盤固件配置詳解 前言 大家好&#xff01;今天給大家帶來QMK鍵盤固件配置的詳細指南。如果你正在DIY機械鍵盤或者想要給自己的鍵盤刷固件&#xff0c;這篇文章絕對不容錯過。QMK是目前最流行的開源鍵盤固件框架之一&#xff0c;它允許我們對鍵盤進行高度自定義。接下來&a…

基于STM32、HAL庫的DPS368XTSA1氣壓傳感器 驅動程序設計

一、簡介: DPS368XTSA1 是 InvenSense(TDK 集團旗下公司)生產的一款高精度數字氣壓傳感器,專為需要精確測量氣壓和溫度的應用場景設計。它具有超低功耗、高精度、快速響應等特點,非常適合物聯網、可穿戴設備和無人機等應用。 二、硬件接口: DPS368XTSA1 引腳STM32L4XX 引…

因子分析——數學原理及R語言代碼

正交因子分析 目的數學原理參數估計方法主成分法主因子法極大似然法 因子旋轉模型檢驗因子得分加權最小二乘法回歸法 代碼實現注意事項例子 Reference 目的 FactorAnalysis的目的是從多個高度相關的觀測變量中提取出少數幾個LatentFactor&#xff0c;這些因子代表了變量背后的…