C語言 —— 此去經年夢浪蕩魂音 - 深入理解指針(卷二)

目錄

1. 數組名與地址

2.?指針訪問數組

3.一維數組傳參本質

4.二級指針

5. 指針數組

6.?指針數組模擬二維數組?


1. 數組名與地址

我們先看下面這個代碼:

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];

這里我們使用 &arr[0] 的方式拿到了數組第?個元素的地址,但是其實數組名本來就是地址,而且是數組首元素的地址

??

數組名就是數組首元素(第?個元素)的地址,但是有兩個例外:

1. sizeof(數組名):sizeof中單獨放數組名,這?的數組名表示整個數組,計算的是整個數組的大小,單位是字節

#include <stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0;
}

?

?

2. &數組名:這?的數組名表示整個數組,取出的是整個數組的地址(整個數組的地址和數組?元素的地址是有區別的)

#include <stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%p\n", &arr);printf("%p\n", &arr + 1);//增加了40個字節,也就是整個數組的大小return 0;
}

除此之外,任何地?使?數組名,數組名都表示首元素的地址

#include <stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0]   = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n", &arr[0] + 1);printf("arr       = %p\n", arr);printf("arr+1     = %p\n", arr + 1);printf("&arr      = %p\n", &arr);printf("&arr+1    = %p\n", &arr + 1);return 0;
}

?

我們發現&arr[0]和&arr[0]+1相差4個字節,arr和arr+1 相差4個字節,是因為&arr[0] 和 arr 都是?元素的地址,+1就是跳過?個元素

? ??
但是&arr 和 &arr+1相差40個字節,這就是因為&arr是數組的地址,+1 操作是跳過整個數組的


2.?指針訪問數組

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int arr[10] = { 0 };//輸?int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//輸?int* p = arr;for (i = 0; i < sz; i++){scanf("%d", p + i);//scanf("%d", arr+i);//也可以這樣寫}//輸出for (i = 0; i < sz; i++){printf("%d ", *(p + i));//printf("%d ", p[i]);也可以這樣寫}return 0;
}

將 *(p+i) 換成 p[i] 也是能夠正常打印的,在這里解引用操作符和下標引用符產生的效果相同

? ? ?

同理arr[i] 應該等價于 *(arr+i),數組元素的訪問在編譯器處理的時候,也是轉換成?元素的地址+偏移量求出元素的地址,然后解引?來訪問的

?

?


3.一維數組傳參本質

?個問題:我們之前都是在函數外部計算數組的元素個數,那我們可以把函數傳給?個函
數后,函數內部求數組的元素個數嗎?

#include <stdio.h>void test(int arr[])
{int sz2 = sizeof(arr) / sizeof(arr[0]);printf("sz2 = %d\n", sz2);
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz1 = sizeof(arr) / sizeof(arr[0]);printf("sz1 = %d\n", sz1);test(arr);return 0;
}

我們發現在函數內部是沒有正確獲得數組的元素個數

??

我們都知道:數組傳參的本質是傳遞首元素地址所以函數形參的部分理論上應該使?指針變量來接收?元素的地址

? ??

那么在函數內部我們寫sizeof(arr) 計算的是?個地址的大小(單位字節)而不是數組的大小(單位字節),因為函數的參數部分是本質是指針,所以在函數內部是沒辦法求的數組元素個數的

總結:?維數組傳參,形參的部分可以寫成?int * arr 的指針形式,也可以寫成 arr[ ] 的數組形式

?


4.二級指針

指針變量也是變量,是變量就有地址,那指針變量的地址存放在哪??答案是?級指針

??

一個常見的指針是一級指針,那么在一個指針里面再嵌套一個指針就是二級指針

?

*ppa 通過對ppa中的地址進?解引?,這樣找到的是 pa , *ppa 其實訪問的就是 pa?

int b = 20;
*ppa = &b;//等價于 pa = &b;

?**ppa 先通過 *ppa 找到 pa ,然后對 pa 進?解引?操作: *pa ,那找到的是 a?

**ppa = 30;
//等價于*pa = 30;
//等價于a = 30;


5. 指針數組
?

指針數組就是存放指針的數組

指針數組的每個元素都是?來存放地址(指針)的?

?

指針數組的每個元素是地址,?可以指向?塊區域?


6.?指針數組模擬二維數組?

#include <stdio.h>int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };//數組名是數組?元素的地址,類型是int*的,就可以存放在parr數組中int* parr[3] = { arr1, arr2, arr3 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

?

?

parr[i]是訪問parr數組的元素,parr[i]找到的數組元素指向了整型?維數組,parr[i][ j]就是整型?維數組中的元素?


完結撒花~?

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

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

相關文章

基于Python pyscard庫采集ACS ACR122U NFC讀卡器數據的詳細操作步驟

步驟1&#xff1a;安裝驅動 1. 下載驅動&#xff1a; - 訪問ACS官網的驅動下載頁面&#xff1a;[ACR122U驅動下載](https://www.acs.com.hk/en/drivers/6/acr122u-nfc-reader/)。 - 選擇適用于Windows的驅動&#xff08;如 ACR122U Driver (Windows) V3.05.02.zip&#xff09;…

深度學習 Deep Learning 第1章 深度學習簡介

第1章 深度學習簡介 概述 本章介紹人工智能&#xff08;AI&#xff09;和深度學習領域&#xff0c;討論其歷史發展、關鍵概念和應用。解釋深度學習如何從早期的AI和機器學習方法演變而來&#xff0c;以及如何有效解決之前方法無法應對的挑戰。 關鍵概念 1. 人工智能的演變 …

python實現簡單的圖片去水印工具

python實現簡單的圖片去水印工具 使用說明&#xff1a; 點擊"打開圖片"選擇需要處理的圖片 在圖片上拖拽鼠標選擇水印區域&#xff08;紅色矩形框&#xff09; 點擊"去除水印"執行處理 點擊"保存結果"保存處理后的圖片 運行效果 先簡要說明…

軟件功能性測試有哪些步驟和挑戰?軟件測評服務機構分享

軟件功能性測試是對軟件系統進行驗證的一種基本方法。其主要目標是確保軟件系統能夠按照預期的要求和功能進行操作。從用戶的角度看&#xff0c;功能性測試旨在檢查軟件是否實現了所有要求的功能&#xff0c;保證用戶體驗的順暢與滿意。 一、軟件功能性測試的測試步驟   1、…

《C#上位機開發從門外到門內》3-4:基于TCP/IP的遠程監控系統設計與實現

文章目錄 一、項目概述二、系統架構設計三、通信協議設計四、功能模塊實現五、系統安全性與穩定性六、性能優化與測試七、實際應用案例八、結論 隨著信息技術的飛速發展&#xff0c;遠程監控系統在工業自動化、智能家居、環境監測等領域的應用日益廣泛。基于TCP/IP協議的遠程監…

在react當中利用IntersectionObserve實現下拉加載數據

目錄 一、傳統的下拉加載方案 二、存在問題 1.性能較差 2.不夠精確 三、IntersectionObserve版本下拉加載 1、callback 2、options 四、IntersectionObserver實例 1、Intersection的優勢 2、實現思路 3、代碼實現 在進行前端開發的過程中&#xff0c;常常會碰到下拉…

深入理解C++編程:從內存管理到多態與算法實現

C 是一門功能強大的編程語言&#xff0c;廣泛應用于系統編程、游戲開發和高性能計算等領域。本文將通過一系列經典問題&#xff0c;深入探討 C 的核心知識點&#xff0c;包括內存管理、多態&#xff08;結合函數重載與覆蓋&#xff09;、多線程、TCP/IP 模型、軟鏈接與硬鏈接的…

相對論之光速

然而&#xff0c;基礎物理學的進步很少全部由實驗取得。為了解實驗結果背后的機制&#xff0c;法拉第問道&#xff0c;既然磁鐵沒有接觸導線&#xff0c;導線中怎么會產生電流?一股電流又怎么能使指南針指針發生偏轉?有某種作用因素必然在磁鐵、導線和指南針之間的空隙中傳遞…

文本檢測-文本內容審核-文本過濾接口如何用PHP調用?

一、什么是文本檢測接口呢&#xff1f; 文本內容審核過濾&#xff0c;提供對敏感事件、違規詞語及監管要求封禁詞語的識別審核能力&#xff0c;包含海量歷史數據&#xff0c;有效過濾違禁違規、惡意推廣、低俗辱罵、低質灌水、廣告法審核&#xff0c;該接口應用場景廣泛&#…

突破極限:獵板PCB在HDI盲埋孔樹脂塞孔工藝中的創新與挑戰

在高端電子制造領域&#xff0c;HDI&#xff08;高密度互連&#xff09;技術憑借其高精度、高可靠性的特點&#xff0c;已成為5G通信、航空航天、智能汽車等領域的核心技術支撐。作為HDI板制造的核心環節&#xff0c;盲埋孔樹脂塞孔工藝直接決定了電路板的信號完整性、散熱性能…

群體智能優化算法-?魚優化算法 (Remora Optimization Algorithm, ROA,含Matlab源代碼)

摘要 ?魚優化算法&#xff08;Remora Optimization Algorithm&#xff0c;ROA&#xff09;是一種基于?魚在海洋中寄生與捕食者間交互關系而提出的元啟發式算法。通過模擬?魚在宿主附近進行寄生、吸附和隨機機動等行為&#xff0c;ROA 在全局與局部搜索之間取得平衡。本文提…

【數學建模】一致矩陣的應用及其在層次分析法(AHP)中的性質

一致矩陣在層次分析法(AHP)中的應用與性質 在層次分析法(AHP)中&#xff0c;一致矩陣是判斷矩陣的一種理想狀態&#xff0c;它反映了決策者判斷的完全合理性和一致性&#xff0c;也就是為了避免決策者認為“A比B重要&#xff0c;B比C重要&#xff0c;但是C又比A重要”的矛盾。…

DeepSeek R1 與 ktransformers:結合蘋果 M4 Mac 的 LLM 推理深度分析

引言 大型語言模型&#xff08;LLM&#xff09;的快速發展為人工智能領域帶來了革命性變化。DeepSeek R1 和 ktransformers 代表了軟件層面的最新突破&#xff0c;而蘋果在 2025 年 3 月 12 日發布的 M4 Mac 系列則提供了硬件支持。本文將深入分析這些技術的交匯點&#xff0c…

JavaScript基本知識

文章目錄 一、JavaScript基礎1.變量&#xff08;重點&#xff09;1-1 定義變量及賦值1-2 變量的命名規則和命名規范判斷數據類型&#xff1a; 2.數據類型轉換2-1 其他數據類型轉成數值2-2 其他數據類型轉成字符串2-3 其他數據類型轉成布爾 3.函數3-1函數定義階段3-2函數調用階段…

[IP]UART

UART 是一個簡易串口ip&#xff0c;用戶及配置接口簡單。 波特率從9600至2000000。 該 IP 支持以下特性&#xff1a; 異步串行通信&#xff1a;標準 UART 協議&#xff08;1 起始位&#xff0c;8 數據位&#xff0c;1 停止位&#xff0c;無奇偶校驗&#xff09;。 參數化配置…

K8s集群的環境部署

1.測試環境所需要的主機名和IP和扮演的角色 harbor 172.25.254.200 harbor倉庫 k8s-master 172.25.254.100 k8s集群控制節點 k8s-node1 172.25.254.10 k8s集群工作節點 k8s-node2 172.25.254.20 k8集群工作節點 注意&#xff1a;所有節點禁用selinux和防火墻 所有節點同步…

pytest自動化測試[面試篇]

pytest是python的測試框架&#xff0c;它提供了許多功能&#xff0c; 測試運行 組織pytest的測試用例代碼&#xff1a;模塊名稱以test_開頭&#xff0c;類名以Test開頭&#xff0c;函數名以test_開頭, 然后用pytest命令即可運行測試用例。 可以在命令行中&#xff0c;用pyte…

樹莓派急速安裝ubuntu;映射磁盤與儲存磁盤文件;ubuntu映射整個工程;保存系統工作狀態

一、用途 在使用樹莓派上下載ubuntu時&#xff0c;需要一張sd卡&#xff0c;當你需要給這張卡做備份的時候&#xff0c;可以是使用磁盤映射軟件&#xff0c;從而達到備份的目的 同時有一些大佬發布了ubuntu的映射文件&#xff0c;可以直接使用該文件&#xff0c;然后還原他的整…

Python學習第十九天

Django-分頁 后端分頁 Django提供了Paginator類來實現后端分頁。Paginator類可以將一個查詢集&#xff08;QuerySet&#xff09;分成多個頁面&#xff0c;每個頁面包含指定數量的對象。 from django.shortcuts import render, redirect, get_object_or_404 from .models impo…

Windows下安裝Git客戶端

① 官網地址&#xff1a;https://git-scm.com/。 ② Git的優勢 大部分操作在本地完成&#xff0c;不需要聯網&#xff1b;完整性保證&#xff1b;盡可能添加數據而不是刪除或修改數據&#xff1b;分支操作非常快捷流暢&#xff1b;與Linux 命令全面兼容。 ③ Git的安裝 從官網…