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

目錄

一、數組名的理解

二、用指針訪問數組

三、一維數組傳參的本質

四、冒泡排序

五、二級指針

六、指針數組

七、指針數組模擬二維數組

八、結語


一、數組名的理解

數組名其實就是首元素的地址

int arr[3] = {1,2,3};
printf("arr   :%p\n" ,arr);
printf("arr[0]:%p\n" ,&arr[0]);

可以看到,數組名確實就是首元素的地址,但是有沒有想到這個語句?

int r = sizeof(arr)/sizeof(arr[0]);

這是用來求數組的元素個數的,在這里,數組名是個例外,它表示整個數組

既然數組名就是首元素地址,那么 &arr 又代表這什么呢?

int arr[3] = {1,2,3};
printf("arr:    %p\n",arr);
printf("arr+1:  %p\n" ,arr+1);
printf("&arr:   %p\n" ,%arr);
printf("&arr+1: %p\n" ,&arr+1);

可以看到,&arr 和 arr 的地址是一樣的,但是&arr 擁有的權限是整個數組,而arr的權限只有一個元素,因此,他們分別+1的結果就不同了

二、用指針訪問數組

通常我們訪問數組元素使用下標的

printf("%d ",arr[2]);

既然數組名就是首元素地址,那我是不是可以通過指針來訪問呢,比如解引用首元素的指針?

printf("%d ",*arr);

沒問題,而我們又知道數組在內存中的存儲是連續的,那我知道了首元素的地址,那我豈不是也可以找到其他元素的地址,然后對其解引用,就可以訪問其他數組元素了?

for(int i = 0; i<3;i++)
{printf("%d " ,*(arr+i));
}

沒有問題,到此,我們可實現用指針訪問數組了。

但是,你有沒有想過,數組名 arr 是地址,可以通過 arr[2] 來訪問第三個元素,而我們的指針也存放的是地址,那我們的指針可不可以也能這樣 P[2] 訪問其他元素呢?

int* p = arr;
for(int i = 0; i<3;i++)
{printf("%d ",p[i]);
}

也沒問題!是不是很震驚!當然,要注意的是,是用了方括號就不要再帶解引用了哦

我要開始搞事情了,由以上分析可得:*(p+i) == p[ i ] 而? *(p+i) == *(i+p) ==?i[ p ] 了?

int* p = arr;
for (int i = 0; i < 3; i++)
{printf("%d ",i[p]);
}
return 0;

成功了!是不是更感覺很震驚了!當然,這是另類的寫法,我們一般還是要按照常理出牌,不然會被說成是豬隊友的

三、一維數組傳參的本質

大家有沒有經歷過在自己寫的函數中,求數組長度是錯誤的!

void Fun_arr(int arr[])
{int sz = sizeof(arr)/sizeof(arr[0]);
}

為什么求出來是1呢,這是因為數組傳參本質上傳的就是首元素的地址,所以求出來只有一個元素

四、冒泡排序

核心思想:兩兩相鄰元素的比較

14253

這是一個無序數列,現在我們要將其變為升序序列,那就先把第一個元素和第二元素比較,把大的方后面,1 小于4,所以不用管,接下來比較第二個元素和第三個元素,4大于2 ,我們需要把大的放后面,把2和4位置對調:

12453

最后就變成了:

12435

發現沒有,我們進行一次,就把最大的弄的最后面去了,那我們再多進行幾次,不就把第二大,第三大的也弄后面去了?

第二次:

12345

這里剛好就完成了排序。冒泡排序需要視頻講解更方便,圖文講解起來比較費勁,我這里就就不多說了,下面是冒泡排序的代碼:

void Bubble_sort(int arr[], int sz)
{for (int i = 0; i < sz - 1; i++){for (int j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j+1]){//交換int mid = arr[j];arr[j] = arr[j + 1];arr[j + 1] = mid;}}}
}

五、二級指針

二級指針就是該指針指向的變量仍然是一個指針,相應的還有三級指針,n級指針

int a = 10;
int* pa = &a;
int** ppa = &pa;//這里的ppa就是二級指針了

int** ppa = &pa;? 這里的 int* 說明ppa指向的變量的類型,第二個 * 說明ppa是指針變量

當然你要是想找到a,就要對ppa進行兩次解引用。

六、指針數組

前面將指針的時候說了,有整型數組,里面放的全是整型,字符型數組,里面放的全是字符型,那么,指針數組里面放的全部都是指針嘍。

int a = 10;
int b = 20;
int c = 30;
int* pa = &a;
int* pb = &b;
int* pc = &c;
int* arr[3] = {pa,pb,pc};

七、指針數組模擬二維數組

為了鞏固指針數組的理解,我們需要完成一個任務:用指針數組模擬一個二位數組

在學習二維數組的時候,講了二維數組在內存中的存儲是一行挨著一行的,那我們可以把每行的首元素的地址作為一個數組的元素,具體來講就是這個樣子:

int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
int* str[] = {arr1,arr2,arr3};
for(int i = 0; i<3;i++)
{for(int j = 0; j<5;j++){printf("%d ", str[i][j] );}printf("\n");
}

關于這里的打印,前面說了,可以用指針加方括號的形式打印,所以就寫成了 str[ i ][ j ],因為? ? str[ i ] 表示的是一個地址嘛。

八、結語

指針的學習沒有終點。繼續探索,挑戰自己,你將發現C語言指針的強大之處,并能編寫出更高效、更靈活的代碼。愿你在C語言指針的世界里越走越遠,收獲滿滿!

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

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

相關文章

Spring MVC 接口的訪問方法如何設置

RequestMapping 是 Spring 框架中用于映射 HTTP 請求到控制器方法的注解。它支持以下 HTTP 方法訪問類型&#xff0c;通過 method 屬性指定&#xff1a; GET&#xff1a;用于獲取資源POST&#xff1a;用于提交數據PUT&#xff1a;用于更新資源DELETE&#xff1a;用于刪除資源PA…

linux libdbus使用案例

以下是一個基于 Linux libdbus 的詳細指南,包含服務端和客戶端的完整代碼示例,涵蓋 方法調用、信號發送 和 異步消息處理。libdbus 是 D-Bus 的底層 C 庫,直接操作 D-Bus 協議,適合需要精細控制的場景。 1. libdbus 的核心機制 連接管理:通過 dbus_bus_get 連接系統總線或…

Day118 | 靈神 | 二叉樹 | 刪點成林

Day118 | 靈神 | 二叉樹 | 刪點成林 1110.刪點成林 1110. 刪點成林 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 最直接的思路就是看當前結點的值是不是在要刪除的列表中&#xff0c;在的話刪除當前結點并把左右孩子加入res中 很可惜這樣是錯的&#xff0c;…

趣味編程:鐘表

目錄 1. 效果展示 2. 源碼展示 3. 邏輯概述 3.1 表針繪制函數&#xff08;DrawHand&#xff09; 3.2 表盤繪制函數 3.3 主程序邏輯 4. 小結 概述&#xff1a;本篇博客主要介紹簡易鐘表的繪制。 1. 效果展示 該鐘表會隨著系統的時間變化而變化&#xff0c;動態的效…

ansible進階02

管理主機清單變量 使用變量的原則 變量創建的位置 角色的defaults或vars目錄主機清單playbook或主機清單所在位置的子目錄group_vars和host_varsplay或角色或任務 無論在哪創建變量&#xff0c;都應該遵守一些規則&#xff1a; 保持簡潔不要重復造輪子。不要反復在多個位置…

C40-指針

一 指針的引入 什么是指針:指針是一個變量&#xff0c;其值是另一個變量的內存地址 簡單的使用地址輸出一個變量: 代碼示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*號是取值運算符…

Nginx 返回 504 狀態碼表示 網關超時(Gateway Timeout)原因排查

Nginx 返回 504 狀態碼表示 網關超時&#xff08;Gateway Timeout&#xff09;&#xff0c;這意味著 Nginx 作為反向代理服務器&#xff0c;在等待上游服務器&#xff08;如后端應用服務器、數據庫服務器等&#xff09;響應時&#xff0c;超過了預設的時間限制&#xff0c;最終…

DeepSeek推理優化技巧:提升速度與降低成本

文章目錄 DeepSeek推理優化技巧&#xff1a;提升速度與降低成本引言一、模型優化&#xff1a;減少模型參數與計算量1. 模型剪枝&#xff08;Pruning&#xff09;2. 模型量化&#xff08;Quantization&#xff09;3. 知識蒸餾&#xff08;Knowledge Distillation&#xff09; 二…

深度解析 Sora:從技術原理到多場景實戰的 AI 視頻生成指南【附學習資料包下載】

一、技術架構與核心能力解析 1.1 時空建模體系的創新突破 Sora 在視頻生成領域的核心優勢源于其獨特的時空建模架構。區別于傳統將視頻拆解為單幀處理的模式,Sora 采用時空 Patch 嵌入技術,將連續視頻序列分割為 32x32 像素的時空塊(每個塊包含相鄰 3 幀畫面),通過線性投…

【實戰篇】數字化打印——打印部署管理接口開發

前言 前面的章節已經介紹了打印管理模塊的主要界面設計&#xff0c;本篇介紹用myBuilder開發界面接口&#xff0c;實現最終的功能。 1. 配置打印應用菜單 首先配置掛載好模塊菜單 讓菜單點擊能訪問到對應的頁面 2. 打印部署管理數據表詳細設計 以下是打印部署管理的數據表字…

Window下Jmeter多機壓測方法

1.概述 Jmeter多機壓測的原理&#xff0c;是通過單個jmeter客戶端&#xff0c;控制多個遠程的jmeter服務器&#xff0c;使他們同步的對服務器進行壓力測試。 以此方式收集測試數據的好處在于&#xff1a; 保存測試采樣數據到本地機器通過單臺機器管理多個jmeter執行引擎測試…

ResourceBundle多語言國際化

在 Java 中&#xff0c;ResourceBundle 是一個用于國際化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;的一種機制&#xff0c;它使得程序能夠根據不同的區域設置&#xff08;如語言、國家等&#xff09;加載不同的資源文件。ResourceBundle 主要用于從外…

精益數據分析(62/126):從客戶訪談評分到市場規模估算——移情階段的實戰進階

精益數據分析&#xff08;62/126&#xff09;&#xff1a;從客戶訪談評分到市場規模估算——移情階段的實戰進階 在創業的移情階段&#xff0c;科學評估用戶需求與市場潛力是決定產品方向的關鍵。今天&#xff0c;我們結合Cloud9 IDE的實戰經驗與《精益數據分析》的方法論&…

第四天——貪心算法——種花

1. 題目 有一個花壇&#xff0c;其中0 表示該位置是空的&#xff0c;可以種花。1 表示該位置已經有花&#xff0c;不能種花。 規則&#xff1a;新種的花不能種在相鄰的位置&#xff08;即如果某個位置已經種了花&#xff0c;它的左右兩個相鄰位置不能再種花&#xff09;。給定…

【重磅】配電網智能軟開關和儲能聯合規劃

目錄 1 主要內容 目標函數 數據說明 節點系統圖 2 部分代碼 3 程序結果 4 下載鏈接 1 主要內容 該程序復現《具有源荷不平衡特性的配電網智能軟開關和儲能聯合規劃》部分模型&#xff0c;未考慮聚類分析和分布魯棒部分&#xff0c;就智能軟開關和儲能聯合規劃部分進行了…

QMK固件OLED顯示屏配置教程:從零開始實現個性化鍵盤顯示(實操部分)

QMK固件OLED顯示屏配置教程:從零開始實現個性化鍵盤顯示 ?? 前言: 作為一名鍵盤愛好者,近期研究了QMK固件的OLED顯示屏配置,發現網上的教程要么太過復雜,要么過于簡單無法實際操作。因此決定寫下這篇教程,從零基礎出發,帶大家一步步實現鍵盤OLED屏幕的配置與個性化顯示…

中國科學院計算所:從 NFS 到 JuiceFS,大模型訓推平臺存儲演進之路

中科院計算所在建設大模型訓練與推理平臺過程中&#xff0c;模型規模與數據集數量呈爆發式增長。最初采用簡單的裸機存儲方案&#xff0c;但很快面臨數據孤島、重復冗余、管理混亂和資源利用不均等問題&#xff0c;于是升級到了 NFS 系統。然而&#xff0c;隨著使用強度增加&am…

飛牛NAS本地部署開源TTS文本轉語音工具EasyVoice與遠程使用流程

文章目錄 前言1. 環境準備2. Docker部署與運行3. 簡單使用測試4. 安裝內網穿透4.1 開啟ssh連接安裝cpolar4.2 創建公網地址 5. 配置固定公網地址總結 前言 本文主要介紹如何在fnOS飛牛云NAS使用Docker本地部署一款非常好用的開源TTS文本轉語音工具EasyVoice&#xff0c;并結合…

部署安裝jenkins.war(2.508)

實驗目的&#xff1a;部署jenkins&#xff0c;并與gitlab關聯bulid 所需軟件&#xff1a;jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 實驗主機&#xff1a;8.10具有java環境,內存最少為4G&#xff0c;cpu雙核 目錄 jdk安裝 …

AEO認證的好處 ,如何快速獲取AEO認證?

AEO認證的好處及快速獲取方法 AEO&#xff08;Authorized Economic Operator&#xff0c;經認證的經營者&#xff09; 是海關對符合國際供應鏈安全標準的企業給予的認證&#xff0c;分為 AEO一般認證 和 AEO高級認證。獲得AEO認證可享受多項通關便利&#xff0c;提升企業國際貿…