C語言——深入理解指針(2)(數組與指針)

文章目錄

  • 數組名的理解
  • 使用指針訪問數組
  • 一維數組傳參的本質
  • 冒泡排序
  • 二級指針
  • 指針數組
  • 指針數組模擬二維數組

數組名的理解

之前我們在使用指針訪問數組內容時,有這樣的代碼:

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

這里我們使用&arr[0]的方式拿到了數組第一個元素的地址,但是其實數組名本來就是地址,而且是數組首元素的地址。
我們來做個測試,看數組名到底是不是首元素的地址:
在這里插入圖片描述
從打印出來的值來看,它們確實是一樣的,所以數組名確實是首元素的地址。
那么數組名是首元素地址的話,我們去求地址長度,在32位平臺下應該為4個字節(地址的長度與多少位的平臺有關)
我們用sizeof計算下地址長度是多少:
在這里插入圖片描述
這是為什么呢?
數組名就是數組首元素(第一個元素)的地址,但是有兩個例外:

  • sizeof(數組名),sizeof中單獨放數組名時,這里的數組名表示整個數組,不是首元素的地址,此時計算的是這整個數組的大小,單位是字節。
  • &數組名,這里的數組名表示整個數組,取出的是整個數組的地址(整個數組的地址和數組首元素的地址是有區別的)在這里插入圖片描述
    從值的角度來看的話,取整個數組的地址與取首元素的地址打印出來的值一模一樣。
    這是因為無論是取首元素地址,還是取整個數組的地址,它們的值都是從首元素的地址開始的。
    但是我們平時寫代碼的時候要知道,數組名前+取地址符號是取整個數組的地址。
    如果我們想看看它們的區別還是可以看到的,我們給首元素的地址、整個數組分別都+1:
    在這里插入圖片描述
    在這里插入圖片描述
    我們發現,前兩個地址+1都只跳過了一個整形的大小,而第三個地址+1卻跳過了一個數組的大小(40個字節)
    所以我們將三個地址打印出來只能看到打印出來的值是一樣的,但是類型絕對是不同的,因為int*類型+1跳過的應該是一個整形,而不是40個字節。

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


使用指針訪問數組

有了前面知識的支持,再結合數組的特點,我們就可以很方便的使用指針訪問數組了。
為什么在訪問數組的時候可以使用指針呢?
1.因為數組在內存中是連續存放的,只要是連續存放的,只要找到第一個,就可以順藤摸瓜找到其他的了。
2.指針±整數的運算,方便我們獲得每一個元素的地址

接下來我們寫個代碼,實現用指針訪問數組,給數組的每個元素輸入值,再輸出值。在這里插入圖片描述
注意:
數組就是數組,是一塊連續的空間(數組的大小與元素個數和元素類型都有關系)
而指針(變量)就是指針(變量),是一個變量(通常是4/8個字節)
那么它倆之間的聯系是什么呢?
數組名是地址,是首元素的地址,可以使用指針來訪問數組

拓展:
我們知道arr[i]*(arr+i)這兩種寫法是完全等價的,并且*(arr+i)里面的式子是加法,加法是支持交換律的。所以arr[i]==*(arr+i)==*(i+arr)
我們代入代碼中看會不會錯:
在這里插入圖片描述
結果也是正確的。
既然這三個等價:arr[i]==*(arr+i)==*(i+arr)
*(arr+i)可以寫成arr[i],那么*(i+arr)可不可以寫成i[arr]呢?
我們帶入代碼試試:
在這里插入圖片描述
我們發現即使是這樣程序也沒有問題。那么這說明了什么呢?
我們知道[]是個下標引用操作符,既然加號操作符+可以實現:1+2可以寫成2+1;那么,arr[i]也就可以寫成i[arr]
提示:這種方式雖然可行,但是不推薦。
因為這樣寫不利于閱讀代碼。


一維數組傳參的本質

數組我們學過,數組是可以傳遞給函數的,現在我們討論一下數組傳參的本質。
首先從第一個問題開始:
寫個函數實現數組元素的打印,我們之前都是在函數外部計算數組元素的個數:
在這里插入圖片描述
那我們可以只把數組傳給函數,少傳一個參數。然后在函數內部求數組的元素個數再打印數組嘛?在這里插入圖片描述
此時我們這樣寫卻出現錯誤,數組里的元素只打印了一個,這是為什么呢?我們進行調試:

  • 按F11開始調試,創建數組執行完后打開監視,查看創建的數組有沒有問題:
    在這里插入圖片描述
  • 發現創建數組沒有問題后按F11進入函數內,在監視里輸入arr,10查看數組傳參有沒有問題:在這里插入圖片描述
    此時數組的傳參也沒有問題,我們繼續調試。
  • 當我們繼續往下執行的時候卻發現原本期望的值是10,這里sz卻顯示的是1在這里插入圖片描述
    如果sz是1的話,在下面循環中只能循環一次,所以也就只能打印第一個元素的。
    此時就找到了問題所在,是sz出問題了。

所以這為什么會算錯呢?
我們之前講過,數組傳參有兩個例外:sizeof(數組名)&數組名
只有這兩種例外表示的是整個數組,而現在這段代碼中的Print(arr)并不算這兩種情況,所以此時傳的是首元素的地址。

那我們將首元素的地址傳過去,Print()函數接收不應該用指針嘛?在這里插入圖片描述
這個函數接收的正確寫法就應該是int* p這樣的指針來接收。

那為什么我們之前用int arr[10]這樣數組的形式去接收呢?
因為數組傳參的時候,形參的部分是可以寫成數組的形式的。對于我們之前初學來說,傳的是數組,就用數組來接收,這樣講法對于我們初學接受度很好。
形參的部分雖然可以寫成數組的形式,但是本質上還是指針變量(地址)。就相當于這個地方是int* arr在這里插入圖片描述
既然Print()不屬于那兩種例外,所以傳的就是個地址,形參也就是個指針變量。
那么下面的sizeof(arr)就不是求一個數組的大小了,而是求一個指針變量的大小:在這里插入圖片描述
x86的環境下,無論什么類型的指針,都是4個字節。

所以數組傳參的時候,形參是可以寫成數組的形式的,但是本質上還是一個指針變量(地址),下面要求大小的時候sizeof(arr)求的就不是一整個數組的大小,而是首元素地址的大小。
所以int sz = sizeof(arr) / sizeof(arr[0])是得不到元素個數的

還有一點要說明:
我們說數組傳參的時候傳的是首元素的地址(假設是0x0012ff40),所以傳給函數的地址也是0x0012ff40
所以我們在這個函數里使用的都是0x0012ff40這個地址在這里插入圖片描述
既然實參使用的是0x0012ff40,形參也是使用0x0012ff40,那么實參跟形參使用的數組不就是一樣的嘛?
所以我們得到以下結論:

  • 數組傳參的本質是傳遞了數組首元素的地址,所以形參使用的數組跟實參使用的數組一定是同一個數組。
  • 既然形參使用的數組跟實參使用的數組是同一個數組,所以形參的數組是不會單獨再創建數組空間的,形參的數組是可以省略掉數組大小的:在這里插入圖片描述
    在這里插入圖片描述
    注意:無論形參部分寫不寫10,都不影響下面int sz = sizeof(arr) / sizeof(arr[0])這個表達式(正確寫法時這個表達式一定要放在函數外面!)

接下來我們將這段錯誤代碼改過來:
1.既然數組傳的是地址,函數的形參就寫成指針
2.求數組元素的表達式放在函數外面
正確代碼:
在這里插入圖片描述


冒泡排序

冒泡排序解決的是排序的問題。
冒泡排序的核心思想就是:兩兩相鄰的元素進行比較。
假設我們這里有一串降序的數字:9 8 7 6 5 4 3 2 1 0
我們要排成升序:0 1 2 3 4 5 6 7 8 9 ,此時該怎么用冒泡排序排成升序呢?
在這里插入圖片描述
在這里插入圖片描述
就這樣一對一對的比較下去,最后9會到最后:
在這里插入圖片描述
因為9是最大的一個元素,所以它無論與誰進行比較,都來到最后一位。
這樣將9放在最后,我們叫做一趟冒泡排序
所以剩下該解決9前面的數字
在這里插入圖片描述
所以,一趟冒泡排序解決一個數字。第一趟解決了最大的,第二趟解決了次大的…
那么這個地方有10個元素,要有幾趟冒泡排序呢?
9趟。因為前9個數字在進行冒泡排序后,最后一個數字應該已經在它們應該在的位置上了。
所以是n個元素的時候,我們需要進行n-1趟冒泡排序。

我們開始寫代碼進行實現:

  • 先將元素和排序的函數創建出來在這里插入圖片描述

  • 當我們把排序函數名字寫好之后就是傳參了,因為我們要排的是這個數組,所以數組需要傳進函數。
    并且冒泡排序的趟數得依據元素的個數,而函數內部不能求元素個數,所以得在主函數里面求元素的個數在這里插入圖片描述

  • 接下里寫冒泡排序里的內容

    • 寫形參:指針接收數組(用數組形式也行),int sz接收元素個數。
      因為這個函數只用排好序就行了,所以返回類型寫個void就可以了。在這里插入圖片描述

    • 因為冒泡排序是一趟解決一個元素,所以首先要考慮趟數在這里插入圖片描述
      上面我們說過,當有n個元素的時候,我們需要進行n-1趟冒泡排序,所以i<sz-1

    • 趟數確定后就思考一趟的排序過程:
      一趟排序的過程就是兩個相鄰元素之間相比較,我們創建一個變量j視為元素下標,使得相鄰兩元素之間相比較。在這里插入圖片描述

    • 接下來我們分析:一趟冒泡排序要進行多少對比較。
      以上面的例子來說,當我們進行第一趟冒泡排序的時候,待排序的元素有10個,需要進行9對比較在這里插入圖片描述
      所以代碼循環次數可以寫成這樣,控制9次相鄰元素進行比較
      在這里插入圖片描述
      但是我們發現:當我們進行第二趟冒泡排序的時候,待排序的元素只有9個,需要進行的是8對比較在這里插入圖片描述
      所以比較次數也與趟數有關:
      當第一趟冒泡排序時有10個待排元素,我們要進行9對比較;
      當第二趟冒泡排序時有9個待排元素,我們要進行8對比較;
      即第三趟冒泡排序時有8個待排元素,我們要進行7對比較…
      所以我們將循環次數改為:j<sz-1-i(因為i控制了趟數)
      在這里插入圖片描述
      此時當第一趟冒泡排序的時候,就可以進行9對比較;第二趟冒泡排序的時候,就可以進行8對比較了…

  • 在冒泡排序函數執行完之后,我們寫個函數將這個被排完序的數組打印出來:
    在這里插入圖片描述

完整的代碼為:

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-1-i ; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ",arr[i]);}
}int main()
{int arr[] = {9,8,7,6,5,4,3,2,1,0};//排序int sz = sizeof(arr) / sizeof(arr[0]);//元素個數bubble_sort(arr,sz);//打印print_arr(arr,sz);return 0;
}

打印出的結果:
在這里插入圖片描述
注意:這段代碼是可以優化的。
當需要排序的數組本身是接近有序的情況時:9 0 1 2 3 4 5 6 7 8,此時只需要進行一趟冒泡排序就可以變成:0 1 2 3 4 5 6 7 8 9 在這里插入圖片描述
那我們該怎么進行優化呢?

  • 我們定義一個變量flag,在進行每趟冒泡排序之前都假設這趟元素已經有序:在這里插入圖片描述

  • 如果這趟數組不是有序的,將flag改為0:
    例如9 0 1 2 3 4 5 6 7 8這個數組第一趟冒泡排序時9與0交換了,所以這趟并不是有序的,就將flag改為0,進行下一趟的比較。
    在這里插入圖片描述

  • 下一趟全部比較完后發現并沒有進入到if語句中(0 1 2 3 4 5 6 7 8 98次比較全部不符合if中的表達式,沒進入if語句中),所以flag還是為1,此時就可以跳出循環,不再進行第3趟、第4趟的比較排序了。
    在這里插入圖片描述
    注意:這個break跳的是這個循環,break是在這個循環里的
    在這里插入圖片描述

所以,當任何一對元素交換了,就說明這一趟的元素不是有序的,就得進行下一趟的元素比較、交換。
若是下次沒有元素的交換,就說明這一趟的元素就是有序的,不用再進行下一趟了,所以直接跳出循環。


二級指針

我們寫段常見的代碼:
在這里插入圖片描述
這就是我們之前用的一級指針。
那么什么是二級指針呢?
我們根據上面這段代碼畫出圖:
在這里插入圖片描述
既然p也有地址,那么我們就可以通過&p拿到p的地址,然后放進變量pp里。此時pp就存放著一個一級指針變量的地址,我們叫pp二級指針
在這里插入圖片描述在這里插入圖片描述

那么pp的類型該怎么寫呢?
pp的類型為int**,完整寫法:int** pp=&p;
對于這個類型int**我們該怎么去理解呢?
首先我們要知道,int**是二級指針的類型。在這里插入圖片描述
所以一級指針與二級指針的類型理解思路是一樣的,分兩部分理解:

  • 最后一個*說明該變量是指針
  • 前面一部分說明該變量指向的對象類型

那么,此時p+1pp+1各自跳過幾個字節呢?
我們知道,指針±整數與指針的類型有關。因為p是整形指針,指向的對象為整形,所以p+1跳過4個字節。
那么pp+1呢?
因為pp指向的是int*類型的變量,也就是指針變量。
所以我們就要看指針變量的大小為多少,就跳過幾個字節。有可能是4個字節,也有可能是8個字節。
在這里插入圖片描述
如果我們想取出pp的地址可以嗎?
當然是可以的,此時得寫成:int*** ppp=&pp;
同樣的:int**說明ppp指向的對象(pp)是int**類型的,最后一個*說明ppp是指針變量。此時ppp就是一個三級指針。在這里插入圖片描述
可以一直往下推,但是不建議。

那么二級指針到底是怎么樣用的呢?
如果我們要通過pp找到p有什么辦法呢?
解引用ppp的地址打印出來:
在這里插入圖片描述

*pp——訪問pp里存的地址,找到這個地址后拿該地址里的數據(對pp里的地址進行解引用)

我們也將a的地址打印出來,看看*pp的值是不是a的地址
在這里插入圖片描述
發現值確實一樣。
我們通過對二級指針解引用,可以找到一級指針內存的數據,再進行解引用,就可以找到10了.

*pp==p==&a;
//通過對pp里的地址解引用找到p(a的地址)
//對*pp再次解引用:
**pp==*p=10

在這里插入圖片描述
所以,對二級指針變量兩次解引用可以間接的找到10.


指針數組

指針數組是指針還是數組呢?
答案是數組。
我們類比一下:整型數組,是存放整型的數組;字符數組,是存放字符的數組。在這里插入圖片描述

所以指針數組,是存放指針的數組。
在這里插入圖片描述
指針數組的每個元素都是地址,可以指向?塊區域

那么指針數組有什么用呢?
我們可以用指針數組模擬二維數組。


指針數組模擬二維數組

舉例:
在這里插入圖片描述
當我們寫下這樣的代碼的時候,我們知道,這三個數組各自是一塊內存空間,在內存里也并不是連續存放的,可能離得很遠。

如果我們想把這三塊空間弄成二維數組:將這三個數組分別當成二維數組的第一行、第二行、第三行。

我們該怎么辦呢?
因為數組名是首元素的地址,我們將這三個數組首元素的地址放入到一個指針數組arr中,通過訪問這個指針數組,再訪問到這三個數組。
這樣就可以模擬出一個二維數組了:
在這里插入圖片描述
當我們寫上arr[0]的時候,就是訪問arr數組中arr1這個元素,而這個元素是arr1數組首元素的地址,所以我們就可以在這個地址的基礎上進行+整數,進行arr1數組元素的遍歷。
同理,當我們寫上arr[1]的時候,就是訪問arr數組中arr2這個元素,而這個元素是arr2數組首元素的地址,所以我們也就可以找到arr2數組中的每個元素了…

//可以看作訪問第一行所有元素
arr[0][j];  j:0~4//訪問第二行所有元素:
arr[1][j];  j:0~4//訪問第三行所有元素:
arr[2][j];  j:0~4

這樣就實現了指針數組模擬二維數組

因為arr1共有5個元素,首元素地址+0為元素1的地址,首元素+1為元素2的地址…首元素+4就為元素5的地址了,所以整數j的取值范圍就為0~4

我們繼續寫代碼:
在這里插入圖片描述
實現了每個元素的打印。

注意:這種寫法并不是真的二維數組,真的二維數組在內存中是連續存放的,而這種寫法只是通過地址將三個分散的數組看為三行,再進行打印,這里的arr并不是真的二維數組。

那么既然arr并不是真的二維數組,那么代碼中的打印為什么要寫成二維數組的形式呢?
在這里插入圖片描述
因為:在這里插入圖片描述

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

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

相關文章

在Windows系統中安裝Open WebUI并連接Ollama

Open WebUI是一個開源的大語言模型&#xff08;LLM&#xff09;交互界面&#xff0c;支持本地部署與離線運行。通過它&#xff0c;用戶可以在類似ChatGPT的網頁界面中&#xff0c;直接操作本地運行的Ollama等大語言模型工具。 安裝前的核心要求&#xff1a; Python 3.11&#…

Day4:強化學習之Qlearning走迷宮

一、迷宮游戲 1.環境已知 迷宮環境是定義好的&#xff0c;障礙物位置和空位置是已知的&#xff1b; # 定義迷宮 grid [[0, 0, 0, 1, 0],[0, 1, 0, 1, 0],[0, 1, 0, 0, 0],[0, 0, 0, 1, 0],[0, 1, 1, 1, 0] ] 2.獎勵方式已知 如果碰到障礙物則得-1&#xff0c;如果到終點則…

家里WiFi信號穿墻后信號太差怎么處理?

一、首先在調制解調器&#xff08;俗稱&#xff1a;貓&#xff09;測試網速&#xff0c;網速達不到聯系運營商&#xff1b; 二、網線影響不大&#xff0c;5類網線跑500M完全沒問題&#xff1b; 三、可以在臥室增加輔助路由器&#xff08;例如小米AX系列&#xff09;90~200元區…

視點開場動畫實現(九)

這個相對比較簡單&#xff1a; void COSGObject::FlyTo(double lon, double lat, double hei) {theApp.bNeedModify TRUE;while(!theApp.bCanModify)Sleep(1);em->setViewpoint(osgEarth::Viewpoint("0",lon, lat, 0, 0, -45, hei), 2);theApp.bNeedModify FAL…

保姆級GitHub大文件(100mb-2gb)上傳教程

GLF&#xff08;Git Large File Storage&#xff09;安裝使用 使用GitHub desktop上傳大于100mb的文件時報錯 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…

HTML之JavaScript DOM(document)編程處理事件

HTML之JavaScript DOM&#xff08;document&#xff09;編程處理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Redis7——基礎篇(四)

前言&#xff1a;此篇文章系本人學習過程中記錄下來的筆記&#xff0c;里面難免會有不少欠缺的地方&#xff0c;誠心期待大家多多給予指教。 基礎篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09; 接上期內容&…

Sprinig源碼解析

前言 Spring 框架是 Java 企業級開發的基石&#xff0c;其源碼設計體現了模塊化、擴展性和靈活性。以下從 IoC 容器、AOP 實現、核心模塊和關鍵設計模式四個角度對 Spring 源碼進行深度解析&#xff0c;幫助理解其底層機制。即使Spring會使用的人見得就能使用。 一、IoC 容器源…

如何簡單的去使用jconsloe 查看線程 (多線程編程篇1)

目錄 前言 1.進程和線程 進程 PCB 的作用 并發編程和并行編程 線程 為什么選擇多線程編程 2.在IDEA中如何簡單創建一個線程 1. 通過繼承Thread類 2. 通過實現 Runnable 接口 3. 使用 Lambda 表達式 3.如何簡單使用jconsloe去查看創建好的線程 前言 2025來了,這是第…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析④】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase04 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月17日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-004測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

3.10 實戰Hugging Face Transformers:從文本分類到模型部署全流程

實戰Hugging Face Transformers:從文本分類到模型部署全流程 一、文本分類實戰:IMDB電影評論情感分析 1.1 數據準備與預處理 from datasets import load_dataset from transformers import AutoTokenizer # 加載IMDB數據集 dataset = load_dataset("imdb") …

【人工智能】釋放數據潛能:使用Featuretools進行自動化特征工程

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 特征工程是機器學習流程中至關重要的一步,它直接影響模型的性能。然而,手動特征工程既耗時又需要領域專業知識。Featuretools是一個強大的…

MybaitsPlus學習筆記(二)基本CURD

目錄 一、BaseMapper 二、常用實例 1、插入 2、刪除 3、修改 4、查詢 三、IService 四、 IService中的一些方法測試 一、BaseMapper MyBatis-Plus中的基本CRUD在內置的BaseMapper中都已得到了實現&#xff0c;我們可以直接使用&#xff0c;接口如 下&#xff1a; publ…

設計模式之適配模式是什么?以及在Spring AOP中的攔截器鏈的使用源碼解析。

前言 本文涉及到適配模式的基本用法&#xff0c;以及在Spring AOP中如何使用&#xff0c;首先需要了解適配模式的工作原理&#xff0c;然后結合Spring AOP的具體實現來詳細詳細解析源碼。 首先&#xff0c;適配模式&#xff0c;也就是Adapter Pattern&#xff0c;屬于結構型設計…

【C++】36.C++IO流

文章目錄 1. C語言的輸入與輸出2. 流是什么3. CIO流3.1 C標準IO流3.2 C文件IO流 4. stringstream的簡單介紹 1. C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放在變量中。pri…

JavaScript表單介紹

一、表單的基本概念 在網頁開發里&#xff0c;表單是實現用戶與網頁交互的關鍵組件&#xff0c;用于收集用戶輸入的數據&#xff0c;JavaScript 則能為表單增添強大的交互性和功能性。表單在 HTML 里通過 <form> 標簽創建&#xff0c;包含多種表單元素&#xff0c;如文本…

哈希表(C語言版)

文章目錄 哈希表原理實現(無自動擴容功能)代碼運行結果 分析應用 哈希表 如何統計一段文本中&#xff0c;小寫字母出現的次數? 顯然&#xff0c;我們可以用數組 int table[26] 來存儲每個小寫字母出現的次數&#xff0c;而且這樣處理&#xff0c;效率奇高。假如我們想知道字…

昆蟲-目標檢測數據集(包括VOC格式、YOLO格式)

昆蟲-目標檢測數據集&#xff08;包括VOC格式、YOLO格式&#xff09; 數據集&#xff1a; 鏈接: https://pan.baidu.com/s/1tYb8s-AVJgSp7SGvqdWF9A?pwdt76a 提取碼: t76a 數據集信息介紹&#xff1a; 共有 6009 張圖像和一一對應的標注文件 標注文件格式提供了兩種&#x…

C++(23):unreachable

C++23在頭文件 "><utility>定義了std::unreachable(),用于指示編譯器,該段代碼不應該被允許,因此編譯器可以對該位置進行優化,如果一旦允許了該位置的代碼,行為未定義: #include <utility> #include <iostream>using namespace std;int func(…

備戰藍橋杯 Day1 回顧語言基礎

開啟藍橋杯刷題之路 Day1 回顧語言基礎 1.配置dev 工具->編譯選項->勾選編譯時加入以下命令->設定編譯器配置(release和debug)都要-> -stdc11 ->代碼生成/優化->代碼生成/優化->語言標準(-std)->ISO C11 ->代碼警告->顯示最多警告信息(-Wall)…