深入學習指針2

前言?

hello,我又來了,今天有我繼續帶領大家深入的學習指針,通過上次的學習,我們已經了解到了指針的基本概念,指針如何使用,指針使用的益處,以及一些相關的概念,那今天我們就繼續深入的學習,加深對指針的理解,還沒有看上期的uu,記得補功課喲 ,鏈接在這里了http://t.csdnimg.cn/VBh89,

那廢話就不多說,開始我們今天的正題,如果覺得不錯的話,就不要吝嗇手中的三連哦,萬分感謝!!

1. 數組名的理解??

在上一次我們學習的時候我們有遇到過這樣的代碼。

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

這里使用&arr[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 = %p\n",arr);    return 0;}

?測試結果:

我們發現數組名和數組?元素的地址打印出的結果?模?樣,數組名就是數組?元素(第?個元素)的地址。

這時候有同學會有疑問?數組名如果是數組?元素的地址,那下?的代碼怎么理解呢??

 #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;}

?結果輸出的是40,如果arr是數組首元素的地址,那因該輸出 4/8才對呀?

其實關于數組名的使用,有兩個例外:

? sizeof(數組名),sizeof中單獨放數組名,這?的數組名表?整個數組,計算的是整個數組的??, 單位是字節

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

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

好奇的uu可以來試試這個代碼呀:

  #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  = %p\n", &arr); printf("&arr= %p\n", arr);    return 0;}

三個打印的結果一摸一樣,這時候又納悶了,那arr和&arr的區別是什么呢?

#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個例外。?

2. 使?指針訪問數組

有了前面的只是支持,再結合數組的特點,我們就可以很方便的使用指針訪問數組。

#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));}return 0;
}

這個代碼搞明?后,我們再試?下,如果我們再分析?下,數組名arr是數組?元素的地址,可以賦值給p,其實數組名arr和p在這?是等價的。那我們可以使?arr[i]可以訪問數組的元素,那p[i]是否也可以訪問數組呢??

 #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]);}return 0;}

將*(p+i)換成p[i]也是能夠正常打印的,所以本質上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) 計算的是?個地址的??(單位字節)?不是數組的??(單位字節)。正是因為函數的參數部分是本質是指針,所以在函數內部是沒辦法求的數組元素個數的。

 void test(int arr[])//參數寫成數組形式,本質上還是指針{printf("%d\n", sizeof(arr));}void test(int* arr)//參數寫成指針形式{printf("%d\n", sizeof(arr));//計算?個指針變量的?? 
}int main(){int arr[10] = {1,2,3,4,5,6,7,8,9,10};test(arr);return 0;}

?總結:?維數組傳參,形參的部分可以寫成數組的形式,也可以寫成指針的形式。

4. 冒泡排序

冒泡排序的核心思想:兩類相鄰元素比較。

//?法1 
void bubble_sort(int arr[], int sz)//參數接收數組元素個數{int i = 0;for(i=0; i<sz-1; i++){int j = 0;for(j=0; j<sz-i-1; j++){if(arr[j] > arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}int main(){int arr[] = {3,1,7,5,8,9,0,2,4,6};int sz = sizeof(arr)/sizeof(arr[0]);bubble_sort(arr, sz);for(i=0; i<sz; i++){printf("%d ", arr[i]);}return 0;}
 //?法2 - 優化void bubble_sort(int arr[], int sz)//參數接收數組元素個數{int i = 0;for(i=0; i<sz-1; i++){int flag = 1;//假設這?趟已經有序了int j = 0;for(j=0; j<sz-i-1; j++){if(arr[j] > arr[j+1]){flag = 0;//發?交換就說明,?序int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}if(flag == 1)//這?趟沒交換就說明已經有序,后續?序排序了break;}}int main(){int arr[] = {3,1,7,5,8,9,0,2,4,6};int sz = sizeof(arr)/sizeof(arr[0]);bubble_sort(arr, sz);for(i=0; i<sz; i++){printf("%d ", arr[i]);}return 0;}

好,今天的指針學習就可以先告一段落了,感興趣的uu們一定不要吝嗇手中三連啊!!

咱們下期再見,拜拜!!

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

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

相關文章

Vue3專欄項目 -- 二、自定義From組件(下)

需求分析&#xff1a; 現在我們還需要一個整體的表單在單擊某個按鈕的時候可以循環的驗證每個input的值&#xff0c;最后我們還需要有一個事件可以得到最后驗證的結果&#xff0c;從而進行下一步的操作 如下&#xff0c;我們應該有一個form表單包裹著全部的input表單&#xf…

Java面試八股之Java中的IO流分為幾種

Java中的IO流分為幾種 按數據單位分類&#xff1a; 字節流&#xff08;Byte Stream&#xff09;&#xff1a;以字節&#xff08;8位二進制數&#xff09;為基本單位進行數據讀寫。字節流適合處理所有類型的數據&#xff0c;包括文本、圖像、音頻、視頻等二進制文件。抽象基類…

打破地域界限,HubSpot海外獲客系統引領企業走向國際化

在全球化的浪潮中&#xff0c;企業如何精準把握海外市場、高效獲取并轉化目標客戶&#xff0c;已成為決定其市場地位與未來發展的關鍵因素。HubSpot海外獲客系統以其獨特的視角、強大的功能和卓越的性能&#xff0c;正在引領全球營銷進入一個新的時代。今天運營壇將深入剖析Hub…

阿里巴巴找黃金寶箱(II) - 貪心思維

系列文章目錄 文章目錄 系列文章目錄前言一、題目描述二、輸出描述三、輸入描述四、java代碼五、測試用例 前言 本人最近再練習算法&#xff0c;所以會發布自己的解題思路&#xff0c;希望大家多指教 一、題目描述 一貧如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;無意中發…

KUKA機器人專業名詞解釋

1、CCU Cabinet Control Unit &#xff08;控制柜控制單元&#xff09; 2、CIB Cabinet Interface Board &#xff08;控制柜接口板&#xff09; 3、HMI Human Machine Interface &#xff08;人機界面&#xff09;&#xff1b;KUKA.HMI 是 KUKA 操作界面。 4、KCB …

工作組PTH

文章目錄 簡述RID 500本地管理員密碼噴灑何為RIP 500 安全標識符SID與RIDPTH為何必須是RID 500CrackMapExec進行密碼噴灑 簡述 在工作組PTH中為什么只有administrator賬號可以,下面進行講解與利用。RID 500本地管理員密碼噴灑 何為RIP 500 安全標識符 安全標識符 安全標識符…

觸摸OpenNJet,云原生世界觸手可及

&#x1f308;個人主頁: Aileen_0v0 &#x1f525;熱門專欄: 華為鴻蒙系統學習|計算機網絡|數據結構與算法 ?&#x1f4ab;個人格言:“沒有羅馬,那就自己創造羅馬~” 文章目錄 導言OpenNJet云原生引擎介紹云原生平臺的介紹優化與創新 為什么選擇OpenNJet云原生引擎如何在windo…

Pytorch基礎:torch.cuda.set_device函數

相關閱讀 Pytorch基礎https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 torch.cuda.set_device函數用于設置當前使用的cuda設備&#xff0c;在當擁有多個可用的GPU且能被pytorch識別的cuda設備情況下&#xff08;環境變量CUDA_VISIBLE_…

【AI大模型】自動生成紅隊攻擊提示--GPTFUZZER

本篇參考論文為&#xff1a; Yu J, Lin X, Xing X. Gptfuzzer: Red teaming large language models with auto-generated jailbreak prompts[J]. arXiv preprint arXiv:2309.10253, 2023. https://arxiv.org/pdf/2309.10253 一 背景 雖然LLM在今天的各個領域得到了廣泛的運用…

計算方法實驗7:實現三次樣條插值算法

任務 point.txt文件中包含了21個壓鐵的位置信息 利用大M法計算出木條在壓鐵控制下的曲線&#xff0c;邊界條件取自然邊界條件&#xff1b;將第10個壓鐵的位置移動至(0,10)&#xff0c;計算出新的曲線&#xff0c;觀察每個區間內的三次函數是否改變。 算法 μ i M i ? 1 2 …

MacOS java多版本安裝與管理

Home - SDKMAN! the Software Development Kit Manager # 安裝sdkman curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk version正常出現sdkman版本號就安裝成功了 # 安裝java # 安裝java8 sdk install java 8.0…

論文筆記:僅一個進程故障就無法達成共識

僅一個進程故障就無法達成共識 僅一個進程故障指的是在異步的分布式系統中 摘要 異步系統的共識問題&#xff08;consensus&#xff09;涉及一組進程&#xff0c;其中有的進程可能不可靠&#xff08;unreliable&#xff09;。共識問題要求可靠的進程一致地從兩個侯選中決定&…

【MATLAB源碼-第207期】基于matlab的單相光伏并網系統仿真,并網策略采用基于擾動觀測法的MPPT模型和使用電壓電流雙閉環SPWM控制。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 本文將重點分析光伏發電最大功率點跟蹤&#xff08;MPPT&#xff09;技術和逆變器的并網控制技術&#xff0c;并在Simulink環境下建立模擬系統&#xff0c;以體現這些技術的應用與效果。文章結構如下&#xff1a;首先簡介光伏…

OpenAI下周發布更新;TikTok將自動標記AIGC;智譜AI亮相2024 ICLR

OpenAI 官宣下周舉辦直播發布更新 OpenAI 今日凌晨官宣&#xff0c;將在當地時間 5 月 13 日上午十點&#xff08;北京時間 5 月 14 日凌晨兩點&#xff09;在官網進行直播&#xff0c;屆時將演示一些 ChatGPT 和 GPT-4 的更新。 OpenAI CEO Sam Altman 補充表示&#xff0c;屆…

【算法刷題day44】Leetcode:518. 零錢兌換 II、377. 組合總和 Ⅳ

文章目錄 Leetcode 518. 零錢兌換 II解題思路代碼總結 Leetcode 377. 組合總和 Ⅳ解題思路代碼總結 草稿圖網站 java的Deque Leetcode 518. 零錢兌換 II 題目&#xff1a;518. 零錢兌換 II 解析&#xff1a;代碼隨想錄解析 解題思路 先遍歷物品&#xff0c;再遍歷背包。 代碼…

2024軟件測試面試必備面試題大全

1. 請自我介紹一下(需簡單清楚的表述自已的基本情況&#xff0c;在這過程中要展現出自信&#xff0c;對工作有激情&#xff0c;上進&#xff0c;好學) 面試官您好&#xff0c;我叫###&#xff0c;今年26歲&#xff0c;來自江西九江&#xff0c;就讀專業是電子商務&#xff0c;…

PCIE協議-2-事務層規范-MEM/IO/CFG request rules

2.2.7 內存、I/O和配置請求規則 以下規則適用于所有內存、I/O和配置請求。每種類型的請求還有特定的額外規則。 所有內存、I/O和配置請求除了常見的頭標字段外&#xff0c;還包括以下字段&#xff1a;requester ID[15:0]和Tag[9:0]&#xff0c;形成事務ID。Last DW BE[3:0] a…

ICode國際青少年編程競賽- Python-2級訓練場-列表遍歷

ICode國際青少年編程競賽- Python-2級訓練場-列表遍歷 1、 for i in range(3):Flyer[i].step(2) Dev.step(6)2、 for i in range(7):Flyer[i].step() Dev.step(Item.x - Dev.x)3、 for i in range(3):Flyer[i].step(1) Dev.step(4) Dev.turnLeft() Dev.step(2) Dev.turnL…

【APM】在Kubernetes中搭建OpenTelemetry+Loki+Tempo+Grafana鏈路追蹤(一)

文章目錄 1、最終效果2、前提準備2、環境信息3、服務集成&#xff08;Opentelemetry ->Tempo&#xff09;3.1 上報鏈路數據3.1.1 下載opentelemetry-agent3.1.2 啟動配置業務app3.1.3 配置opentelemetry輸入輸出3.1.4 配置grafana datasource3.1.4.1 配置tempo3.1.4.2 配置l…

快速判斷出485從站設備是否支持MODBUS RTU無線通訊

對于變頻器和儀表設備&#xff0c;都支持485串口通訊&#xff0c;那么怎么判斷從站設備支持那種協議呢&#xff1f;通常分為兩種方式去判斷&#xff1a;1.從設備參數參看2.從設備通訊報文查看。本次文章以以臺達MH300系列變頻器為例。 1.從設備通訊參數查看 使用設備之前一定…