C語言初階:數組

目錄

0.數組要講的知識點

?1.一維數組的創建和初始化

?????????1.1 數組的創建:

?????????1.2數組實例:

?????????1.3?數組的初識化:

例子:

2.一維數組的使用

例子:

總結:

3.一維數組在內存中的存儲

4.二維數組的創建和初始化

? ? ? ? 4.1 二維數組的創建:

? ? ? ? 4.2 二維數組的初始化:

5.二維數組的使用:

二維數組的訪問

訪問單個元素

輸入二維數組,會打印出來

6.二維數組在內存中的存儲:

7.數組越界

一維數組的數組越界例子:

二維數組的數組越界例子:

8.數組作為函數參數

冒泡排序的核心思想:

冒泡排序的錯誤寫法:

冒泡排序函數的正確設計:

補充知識點:數組名

一維數組的數組名的理解:

但是,有兩個例外:

?編輯

1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。

2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。

二維數組的數組名的理解:

但是,有兩個例外:

1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。

2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。


0.數組要講的知識點

?1.一維數組的創建和初始化

?????????1.1 數組的創建:

數組是一組相同類型元素的集合

數組的創建方式:

?????????1.2數組實例:

?在C99標準之前,數值的大小必須是常量或者常量表達式

在C99之后,數值的大小可以是變量,為了支持變長數組(這種數組是不能初識化的)

?????????1.3?數組的初識化:

數組的初始化是指,在創建數組的同時給數組的內容一些合理初始值(初始化)

例子:

像第一個數組就是不完全初始化,像第三個就是完全初識化。數組在創建的時候如果想不指定數組的確定的大小就得初始化。數組的元素個數根據初始化的內容來確定,像第二個數組。

第一個里面有四個元素最后一個是“\0” 第二個里面有三個元素

2.一維數組的使用

對于數組的使用我們之前介紹了一個操作符: [] ,下標引用操作符。它其實就數組訪問的操作符。例如arr[4];我們找的是下標為4的元素

例子:

#include <stdio.h>int main()
{int arr[10] = { 0 };//數組的不完全初始化int sz = sizeof(arr) / sizeof(arr[0]);//計算數組的元素個數//對數組內容賦值,數組是使用下標來訪問的,下標從0開始。所以:int i = 0;//做下標for (i = 0; i < 10; i++)//這里寫10,好不好?{arr[i] = i;}//輸出數組的內容for (i = 0; i < 10; ++i){printf("%d ", arr[i]);}return 0;
}

總結:

1.數組是使用下標來訪問的,下標是從0開始。

2.數組的大小可以通過計算得到。

3.一維數組在內存中的存儲

#include <stdio.h>int main()
{int arr[10] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; ++i){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;
}

每個元素差地址差四,因為每個整型占4個字節,一個字節給一個地址編號

仔細觀察輸出的結果,我們知道,隨著數組下標的增長,元素的地址,也在有規律的遞增。由此可以得出結論:數組在內存中是連續存放的。

4.二維數組的創建和初始化

? ? ? ? 4.1 二維數組的創建:

例如:第一個二維數組的意思是,創建一個三行四列的整型數組

? ? ? ? 4.2 二維數組的初始化:

第一個二維數組,不分組,那么前面四個給第一行,后面的第二行和第三行都給0,其他的以此類推,最多12個元素。第二個二維數組,分組,{1,2}在第一行,第一行其他兩個給00,第二行同理,第三行全是0。第三個二維數組,行可以省略,但列不能省略,{1,2}在第一行,第一行其他兩個給00,第二行同理,沒有第三行。

5.二維數組的使用:

二維數組的使用也是通過下標的方式。可以把二維數組理解為:一維數組的數組

二維數組的訪問

#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

訪問單個元素

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

輸入二維數組,會打印出來

#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){scanf("%d", &arr[i][j]);}}for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

6.二維數組在內存中的存儲:

像一維數組一樣,這里我們嘗試打印二維數組的每個元素

#include <stdio.h>//打印地址
int main()
{int arr[3][4];int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

通過結果我們可以分析到,其實二維數組在內存中也是連續存儲的。我們會發現,他們的每個元素也是差4個字節的和一維數組一樣

他們是一行跟著一行的。

我們回來看為什么二位數組一定要有列,因為,看二維數組的存儲空間,如果不知道一行放幾個,下一行怎么知道跟哪去。

7.數組越界

數組的下標是有范圍限制的。數組的下規定是從0開始的,如果數組有n個元素,最后一個元素的下標就是n-1。

所以數組的下標如果小于0,或者大于n-1,就是數組越界訪問了,超出了數組合法空間的訪問。

C語言本身是不做數組下標的越界檢查,編譯器也不一定報錯,但是編譯器不報錯,并不意味著程序就是正確的0

所以程序員寫代碼時,最好自己做越界的檢查

一維數組的數組越界例子:

#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6 };//0~5 6~9int i = 0;//0~9int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0;i < 10;i++){printf("%d ", arr[i]);}return 0;
}

二維數組的數組越界例子:

#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int i = 0;for (i = 0;i < 3;i++){int j = 0;for (j = 0;j <= 4;j++){printf("%d ", arr[i][j]);}}return 0;
}

8.數組作為函數參數

往往我們在寫代碼的時候,會將數組作為參數傳個函數,比如:我要實現一個冒泡排序(這里要講算法思想)函數將一個整形數組排序。

以冒泡排序為例子

冒泡排序的核心思想:

冒泡排序的錯誤寫法:

#include <stdio.h>void bubble_sort(int arr[])
{//趟數int sz = sizeof(arr) / sizeof(arr[0]);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;}		}}
}int main()
{//數組//把數組的數據排成升序int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//0 1 2 3 4 5 6 7 8 9int sz = sizeof(arr) / sizeof(arr[0]);//冒泡排序的算法,對數組進行排序bubble_sort(arr);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

出問題,那我們找一下問題,調試之后可以看到 bubble_sort 函數內部的 sz ,是1。難道數組作為函數參數的時候,不是把整個數組的傳遞過去

冒泡排序函數的正確設計:

#include <stdio.h>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;}}}
}int main()
{//數組//把數組的數據排成升序int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//0 1 2 3 4 5 6 7 8 9int sz = sizeof(arr) / sizeof(arr[0]);//冒泡排序的算法,對數組進行排序bubble_sort(arr,sz);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

sz要在自定義函數外部求

補充知識點:數組名

一維數組的數組名的理解:

數組名確實能表示首元素的地址

但是,有兩個例外:

1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。
2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。

二維數組的數組名的理解:

二維數組表示首元素的地址時,表示第一行的地址

但是,有兩個例外:

1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。
2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。

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

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

相關文章

UE5 Daz頭發轉Blender曲線再導出ABC成為Groom

先安裝Daz to Blender Import插件 【神器】 --DAZ一鍵導入blender插件的詳細安裝和使用&#xff0c;自帶骨骼綁定和控制器&#xff0c;多姿勢動畫&#xff0c;Importer橋接插件_嗶哩嗶哩_bilibili 然后安裝DAZHairConverter插件 一分鐘將DAZ頭發轉化成Blender粒子毛發_嗶哩嗶…

淺聊find_package命令的搜索模式(Search Modes)

背景 find_package應該算是我們使用最多的cmake命令了。但是它是如何找到上游庫的.cmake文件的&#xff1f; 根據官方文檔&#xff0c;整理下find_package涉及到的搜索模式。 搜索模式 find_package涉及到的搜索模式有兩種&#xff1a;模塊模式(Module mode)和配置模式(Conf…

什么是先驗?(CVPR25)Detail-Preserving Latent Diffusion for Stable Shadow Removal論文閱讀

文章目錄 先驗&#xff08;Prior&#xff09;是什么&#xff1f;1. 先驗的數學定義2. 先驗在深度生成模型中的角色3. 為什么需要先驗&#xff1f;4. 先驗的常見類型5. 如何選擇或構造先驗&#xff1f;6. 小結 先驗&#xff08;Prior&#xff09;是什么&#xff1f; 在概率統計…

【視覺基礎模型-SAM系列-2】SAM2: Segment Anything in Images and Videos

論文鏈接&#xff1a;SAM 2: Segment Anything in Images and Videos 代碼鏈接&#xff1a;https://github.com/facebookresearch/sam2?tabreadme-ov-file 作者&#xff1a;Nikhila Ravi, Valentin Gabeur, Yuan-Ting Hu, Ronghang Hu, Chaitanya Ryali, Tengyu Ma, Haitham…

OpenShift AI - 模型注冊管理

《OpenShift / RHEL / DevSecOps 匯總目錄》 說明&#xff1a;本文已經在 OpenShift 4.18 OpenShift AI 2.19 的環境中驗證 文章目錄 啟用模型注冊管理功能安裝管理數據庫啟用模型注冊功能 注冊模型部署模型歸檔模型歸檔模型和模型版本恢復歸檔模型 模型注冊表訪問權限管理參考…

【背包dp----01背包】例題三------(標準的01背包+變種01背包1【恰好裝滿背包體積 產生的 最大價值】)

【模板】01背包 題目鏈接 題目描述 : 輸入描述: 輸出描述: 示例1 輸入 3 5 2 10 4 5 1 4輸出 14 9說明 裝第一個和第三個物品時總價值最大&#xff0c;但是裝第二個和第三個物品可以使得背包恰好裝滿且總價值最大。 示例2 輸入 3 8 12 6 11 8 6 8輸出 8 0說明 裝第三個物…

Node.js 的 child_process 模塊詳解

Node.js 的 child_process 模塊提供了創建子進程的能力,使 Node.js 應用能夠執行系統命令、運行其他程序或腳本。這個模塊非常強大,可以幫助我們實現很多復雜的功能。 1. exec - 執行 shell 命令 exec 方法用于執行 shell 命令,并緩沖任何產生的輸出。 特點 創建 shell 來…

進程與線程詳細介紹

目錄 一 進程概念 二 進程的組成 2.1 PCB 2.2 數據段 2.3 程序段 三 進程的五大特點 四 進程的創建與銷毀 五 線程概念 六 線程特征 七 進程與線程的區別與聯系 區別 聯系 一 進程概念 進程是程序的一次執行過程&#xff0c;是操作系統進行資源分配和調度的基本單位…

如何在服務器后臺運行Python腳本,并配置虛擬環境與GPU支持

使用Conda虛擬環境在服務器后臺運行Python腳本&#xff0c;并檢查GPU分配 在服務器開發環境中&#xff0c;我們需要確保Python腳本運行在指定的Conda虛擬環境中&#xff0c;并且確認是否正確分配了GPU資源。本文將通過一個完整的start.sh腳本&#xff0c;完成以下功能&#xff…

前端取經路——工程化渡劫:八戒的構建之道

大家好,我是老十三,一名前端開發工程師。前端工程化就像八戒的釘耙,看似簡單卻能降妖除魔。在本文中,我將帶你探索前端工程化的九大難題,從模塊化組織到CI/CD流程,從代碼規范到自動化測試,揭示這些工具背后的核心原理。無論你是初學者還是資深工程師,這些構建之道都能幫…

Ubuntu 安裝 Keepalived

Keepalived 是什么 Keepalived 是一個用于實現高可用性&#xff08;High Availability, HA&#xff09;的服務&#xff0c;是一款基于 VRRP 協議的高可用軟件&#xff0c;常用于主備切換和虛擬IP漂移&#xff0c;在服務故障時自動實現故障轉移。 Keepalived 的核心功能 功能說…

DHCP理解

文章目錄 DHCP理解DHCP的核心作用DHCP默認端口DHCP的工作原理&#xff08;4個步驟&#xff09;圖示說明&#xff08;含中繼代理&#xff09;DHCP Discover&#xff08;客戶端發現階段&#xff09;DHCP Offer&#xff08;服務器提供階段&#xff09;DHCP Request&#xff08;客戶…

云計算-容器云-部署CICD-jenkins連接gitlab

安裝 Jenkins 將Jenkins部署到default命名空間下。要求完成離線插件的安裝,設置Jenkins的登錄信息和授權策略。 上傳BlueOcean.tar.gz包 [root@k8s-master-node1 ~]#tar -zxvf BlueOcean.tar.gz [root@k8s-master-node1 ~]#cd BlueOcean/images/ vim /etc/docker/daemon.json…

AI 大模型新浪潮:從 DeepSeek-Prover 到 Qwen3,再到 DeepSeek-R2,邁向自動推理的新時代20250507

&#x1f9e0; AI 大模型新浪潮&#xff1a;從 DeepSeek-Prover 到 Qwen3&#xff0c;再到 DeepSeek-R2&#xff0c;邁向自動推理的新時代 &#x1f680; 引言&#xff1a;大模型&#xff0c;不止是語言處理器&#xff0c;而是思維建構者 在 2025 年春天&#xff0c;我們見證了…

觀察者模式(Observer Pattern)詳解

文章目錄 1. 什么是觀察者模式?2. 為什么需要觀察者模式?3. 觀察者模式的核心概念4. 觀察者模式的結構5. 觀察者模式的基本實現簡單的氣象站示例6. 觀察者模式的進階實現推模型 vs 拉模型6.1 推模型(Push Model)6.2 拉模型(Pull Model)7. 觀察者模式的復雜實現7.1 在線商…

前端代碼規范詳細配置

以下是現代前端項目的完整代碼規范配置方案&#xff0c;涵蓋主流技術棧和自動化工具鏈配置&#xff1a; 一、基礎工程配置 1. 項目結構規范 project/ ├── src/ │ ├── assets/ # 靜態資源 │ ├── components/ # 通用組件 │ ├── layouts/ …

Missashe考研日記-day34

Missashe考研日記-day34 1 專業課408 學習時間&#xff1a;3h學習內容&#xff1a; 今天是學習I/O管理第二小節的內容&#xff0c;聽了課也做了題&#xff0c;這是操作系統倒數第二節知識了&#xff0c;還差最后一節就完結了。知識點回顧&#xff1a; 1.I/O核心子系統&#x…

Milvus 向量數據庫詳解與實踐指南

一、Milvus 核心介紹 1. 什么是 Milvus&#xff1f; Milvus 是一款開源、高性能、可擴展的向量數據庫&#xff0c;專門為海量向量數據的存儲、索引和檢索而設計。它支持近似最近鄰搜索&#xff08;ANN&#xff09;&#xff0c;適用于圖像檢索、自然語言處理&#xff08;NLP&am…

算力經濟模型研究:從云計算定價到去中心化算力市場設計

引言&#xff1a;算力商品化的雙重革命 在H800 GPU集群的算力供給能力突破2.3 EFLOPS的今天&#xff0c;算力定價機制正經歷從"資源租賃"到"動態市場"的范式轉變。傳統云計算定價模型&#xff08;如AWS按需實例&#xff09;的靜態價格機制已難以適應大模型…

[D1,2] 貪心刷題

文章目錄 擺動序列最大子數組合買賣股票跳躍游戲跳躍2 擺動序列 不像是貪心&#xff0c;只要抓住擺動這個點&#xff0c;前一個上升&#xff0c;那下一個就要下降&#xff0c;記錄上一次的狀態為1的話&#xff0c;那下一次就要更新為-1&#xff0c;如果上一次為1&#xff0c;這…