C語言數組介紹 -- 一維數組和二維數組的創建、初始化、下標、遍歷、存儲,C99 變長數組

目錄

1. 一維數組

1.1 數組的概念

1.2?一維數組的創建

1.3?一維數組的初始化

1.4 數組的類型

1.5?數組下標

1.5.1?數組元素的遍歷

1.5.2 數組的輸入

1.6 一維數組在內存中的存儲

1.7 sizeof 計算數組元素個數

2. 二維數組?

2.1 二維數組的創建

2.2 二維數組的初始化

2.2.1 不完全初始化

2.2.2 完全初始化

2.2.3 按行初始化

2.2.4 初始化時省略行,但是不能省略列

2.3 二維數組的下標

2.3.1 二維數組的遍歷

2.4 二維數組在內存中的存儲

3. C99 中的變長數組


1. 一維數組

1.1 數組的概念

? ? ? ? 數組是一組相同類型元素的集合。(1)數組中存放的是 1 個或者多個元素,數組元素個數不能為 0。(2)數組中存放的數據的類型是相同的。

1.2?一維數組的創建

? ? ? ? 一維數組創建的基本語法:

type  arr_name[常量值];

? ? ? ? type:數組中元素的數據類型(char,int,struct 等)。

? ? ? ? arr_name:數組名。

? ? ? ? 常量值:表示數組的大小。?

int math[20];    // 創建 math 數組用于存儲 20 人的數學成績,數據成績的類型為 int
double score[10];    // 創建 score 數組用于存儲 10 個人得分情況,得分的類型為 double

1.3?一維數組的初始化

? ? ? ? 數組在創建的時候,給定一些初始值,就叫做數組的初始化。?數組的初始化一般使用大括號,將數據放在大括號中。初始化的時候給定元素個數不能超過數組的大小。

#include <stdio.h>int main()
{int arr1[5] = {1, 2, 3, 4, 5};	// 完全初始化int arr2[6] = { 1, 5 };	// 不完全初始化:前面元素為給定的值,剩余的元素默認初始化為 0。int arr3[7];    // 定義數組的時候可以不初始化,但是默認為隨機值。return 0;
}

1.4 數組的類型

? ? ? ? 數組也是有類型的,數組算是一種自定義類型,去掉數組名留下的就是數組的類型

int arr1[10];int arr2[12];char ch[5];

? ? ? ? arr1 數組的類型是 int [10],arr2 數組的類型是 int [12],ch 數組的類型是 char [5]。?

1.5?數組下標

? ? ? ? C 語言規定數組是有下標的,下標從 0 開始,假設數組有 n 個元素,最后一個元素的下標是 n - 1 ,下標就相當于數組元素的編號,如下:

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

? ? ? ? C 語言數組的訪問提供了一個操作符 " [] ",這個操作符叫做下標訪問操作符。?

? ? ? ? ?有下標訪問操作符,就可以輕松訪問數組的元素了。訪問下標為 7 的元素,就使用 arr[7],如下:

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

1.5.1?數組元素的遍歷

? ? ? ? 可以通過 for 循環 + 下標的方式對整個數組的元素進行遍歷。

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

1.5.2 數組的輸入

? ? ? ? 想對數組中的元素進行修改,可以使用 scanf 進行輸入對數組的元素進行修改

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

? ? ? ? 注:scanf 訪問數組中單獨的一個元素的時候需要加上取地址運算符。?

1.6 一維數組在內存中的存儲

? ? ? ? 我們可以通過打印數組每個元素的地址來觀察數組在內存中是如何存儲的

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

? ? ? ? 從輸出的結果上可以看出來,數組隨著下標的增長,地址是由小變大的,并且每兩個響鈴的元素之間相差 4,這是因為這個數組中目前存儲的數據類型為 int 類型,int 類型每一個元素需要 4 個字節進行存儲。

? ? ? ? 所以可以得出結論:數組在內存中是連續存放的。?

1.7 sizeof 計算數組元素個數

? ? ? ? 如果想直到數組的元素個數,可以使用 sizeof 關鍵字來計算類型或者變量的大小,sizeof 返回的并不是數組的元素個數,返回的是數組占據多少字節,可以通過占據的字節數除以數組中數據類型的方式來計算數組中的元素個數

#include <stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;printf("數組占用的字節數: %d\n", sizeof(arr));printf("數組中一個元素的大小: %d\n", sizeof(arr[0]));//計算?個元素的??,單位是字節int sz = sizeof(arr) / sizeof(arr[0]);printf("數組中元素的個數: %d\n", sz);return 0;
}

2. 二維數組?

2.1 二維數組的創建

? ? ? ? 把一維數組作為數組的元素時,這時候該數組就是二維數組。同理將二維數組作為數組的元素時,這時候該數組就是三位數組。二維數組以上的數組統稱為多維數組。

? ? ? ? 創建二維數組的語法如下:

type arr_name[常量值1][常量值2];

? ? ? ? ?type:表示二維數組中數據的類型。

? ? ? ? arr_name:表示二維數組的數組名。

? ? ? ? 常量1:表示二維數組的行數。

? ? ? ? 常量2:表示二維數組的列數。

int arr[3][5];
double data[2][8];

? ? ? ? 上述中 arr 表示為一個 3 行 5 列的二維數組,存儲的數據類型為 int 類型;data 表示為一個 2 行 8 列的二維數組,存儲的數據類型為 double 類型。?

2.2 二維數組的初始化

2.2.1 不完全初始化

#include <stdio.h>int main()
{int arr1[3][5] = { 1, 2, 3, 4, 5, 6, 7};int arr2[3][5] = { 0 };return 0;
}

? ? ? ? 如上,可以看出,當對二維數組進行初始化的時候,是一行一行進行初始化的,等該行初始化完,在繼續初始化下一行,并且剩余沒有初始化的元素默認初始化為 0

2.2.2 完全初始化

#include <stdio.h>int main()
{int arr3[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };return 0;
}

2.2.3 按行初始化

#include <stdio.h>int main()
{int arr4[3][5] = { {1,2},{3,4},{5,6} };return 0;
}

2.2.4 初始化時省略行,但是不能省略列

int arr5[][5] = { 1,2,3 };
int arr6[][5] = { 1,2,3,4,5,6,7 };
int arr7[][5] = { {1,2}, {3,4}, {5,6} };

2.3 二維數組的下標

? ? ? ? 二維數組是有行有列的,只要鎖定行和列就能鎖定數組中唯一的一個元素

????????C語?規定,?維數組的?是從0開始的,列也是從0開始的,如下所示:

int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

? ? ? ? 如果想要訪問 7 這個數組,那么就可以通過? arr[2][4] 進行訪問。

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

2.3.1 二維數組的遍歷

? ? ? ? 一維數組是使用 for 循環 + 數組下標的方式進行遍歷的,那么二維數組也可以通過同樣的方式對數組進行遍歷,只是遍歷二維數組的時候需要兩層 for 循環。下列就通過遍歷的方式向二維數組中輸入數據并通過 printf 打印出來。

#include <stdio.h>int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };int i = 0;//遍歷?//輸?for (i = 0; i < 3; i++) //產??號{int j = 0;for (j = 0; j < 5; j++) //產?列號{scanf("%d", &arr[i][j]); //輸?數據}}printf("\n");//輸出for (i = 0; i < 3; i++) //產??號{int j = 0;for (j = 0; j < 5; j++) //產?列號{printf("%d ", arr[i][j]); //輸出數據}printf("\n");}return 0;
}

2.4 二維數組在內存中的存儲

? ? ? ? 像一維數組一樣,通過打印出二維數組每個元素的地址觀察二維數組中元素的存儲方式

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

? ? ? ? 從上述的輸出結果可以看出,每一行內部的每個元素都是相鄰的,地址之間相差 4 個字節,跨行位置處的兩個元素也是相鄰的,也只相差 4 個字節,所以二維數組中的每個元素都是連續存放的。?

3. C99 中的變長數組

? ? ? ? 在 C99 標準之前,C 語言在創建數組的時候,數組大小的指定只能使用常量、常量表達式。這樣的語法限制在創建數組的時候不夠靈活,有時候數組創建大了會造成空間浪費,有時候數組創建小了又不夠用。

? ? ? ? C99 中給出一個變長數組(variable-length array,VLA)的新特性,允許我們可以使用變量指定數組大小

int n = a+b;
int arr[n];

? ? ? ? 上面示例中,arr 數組就是變長數組,因為它的長度取決于變量 n 的值,編譯器在編譯的時候無法確定 n 的值為多少,只有運行時才能知道? n 是多少

? ? ? ? 變長數組的根本特征就是數組長度只有運行時才能確定,所以變長數組不能初始化。好處是在開發時不用隨意為數組指定一個估計的長度,可以在運行時為數組分配精確的長度。變?數組的意思是數組的大小是可以使?變量來指定的,在程序運?的時候,根據變量的??來指定數組的元素個數,?不是說數組的??是可變的。數組的大小?旦確定就不能再變化了

? ? ? ? ?在 VS2022 上雖然支持大部分 C99 語法,但是沒有支持 C99 變長數組,下面是在 gcc 編譯器上測試的結果:

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

?

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

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

相關文章

SpringAI + DeepSeek大模型應用開發 - 進階篇(上)

三、SpringAI 2. 哄哄模擬器 2.1 提示詞工程 提示詞工程&#xff08;Prompt Engineering&#xff09;&#xff1a;通過優化提示詞&#xff0c;使大模型生成盡可能理想的內容&#xff0c;這一過程就叫提示詞工程。 &#xff08;1&#xff09;清晰明確的指令 談談人工智能 …

Spring Boot實現異常處理

Spring Boot 提供了多種靈活的方式實現異常處理&#xff0c;以下是核心方案和最佳實踐&#xff1a; 一、基礎異常處理方案 1. ControllerAdvice ExceptionHandler&#xff08;全局處理&#xff09; ControllerAdvice public class GlobalExceptionHandler {// 處理特定異常&…

【目標檢測】IOU的概念與Python實例解析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官網地址&#xff1a;vue-print-nb - npm 1.安裝 npm install vue-print-nb --save 2.導入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置參數 4.頁面使用 <div id"printDiv">打印內容</div><el-button v-print&…

Matplotlib快速入門

目錄 基本使用 解決中文亂碼 一個坐標系繪制多個圖像 多個坐標系繪制 基本使用 什么是Matplotlib 是專門用于開發2D圖表(包括3D圖表)以漸進&#xff0c;交互式方式實現數據可視化 為什么要學習matplotlib 可視化是在整個數據挖掘的關鍵輔助工具&#xff0c;可以清晰的理解…

扣料不允許‘貨物移動’

遇到了報錯&#xff0c;不允許貨物移動 以為又是和之前一樣是訂單已經關閉&#xff0c;看是領錯料還是財務誤關的原因&#xff0c;但是co03一看訂單狀態并沒有關閉 原因就是這個CRTD 訂單只是創建了&#xff0c;但是沒有下達 找個正常的看看&#xff1a; 一般訂單創建和下達都…

【AI】全新AI測試系列之二--------AI自動化測試,提高測試效率

目錄 一、自動化測試 1、與手動測試對比 2、自動化測試流程 二、自動化測試環境搭建 三、web自動化使用AI的兩種方式 1、利用DeepSeek快速生成腳本 2、pycharm集成通義靈碼 四、通義靈碼實戰 1、使用提示詞生成代碼 2、使用pytest框架 前言&#xff1a;上一章節只要是…

npm包沖突install失敗

--legacy-peer-deps是npm&#xff08;Node.js包管理器&#xff09;的一個命令行選項&#xff0c;主要用于解決依賴沖突問題。當安裝依賴時&#xff0c;npm默認會嚴格檢查peer dependencies&#xff08;對等依賴&#xff09;的版本兼容性&#xff0c;可能導致安裝失敗。啟用此選…

68、數據訪問-crud實驗-刪除用戶完成

68、數據訪問-crud實驗-刪除用戶完成 以下是完成“數據訪問-CRUD實驗-刪除用戶”功能的一般步驟&#xff0c;以常見Web應用框架&#xff08;如Spring Boot MyBatis-Plus、Django、Ruby on Rails&#xff09;為例&#xff1a; #### 準備工作 - **數據庫表設計**&#xff1a;確…

實現 TurtleBot3 多點軌跡跟蹤導航

系統架構 move_base本身不支持一次性發送多個目標點并自動按順序導航,使用nav_msgs/Path消息類型發布多個路徑點,然后讓機器人按順序依次到達每個路徑點。 發布一個包含多個路徑點的Path消息(可選,用于在RVIZ中顯示路徑)。按順序將每個路徑點作為MoveBaseGoal發送給move_…

《人性的優點》:破解憂慮密碼,構建積極人生

我強烈推薦4本可以改變命運的經典著作&#xff1a; 《壽康寶鑒》在線閱讀白話文《欲海回狂》在線閱讀白話文《陰律無情》在線閱讀白話文《了凡四訓》在線閱讀白話文 一、世界觀&#xff1a;憂慮的本質與生命的真相 &#xff08;一&#xff09;憂慮是精神的“虛構苦難” 卡耐基…

D2554探鴿協議,sensor屬性,回調

D2554探鴿協議&#xff0c;sensor屬性&#xff0c;回調 各屬性的默認值 對比度&#xff1a; 0x4064&#xff08;10進制&#xff09; 清晰度、銳度&#xff1a; 0x000&#xff08;10進制&#xff09; 飽和度&#xff1a; …

.NET 4.7中使用NLog記錄日志到數據庫表

1. 首先安裝必要的NuGet包 在項目中安裝以下NuGet包&#xff1a; NLog NLog.Config (可選&#xff0c;用于自動生成配置文件) 相應的數據庫提供程序&#xff08;如System.Data.SqlClient for SQL Server&#xff09; Install-Package NLog Install-Package NLog.Config In…

非對稱加密實戰:Python實現數字簽名

目錄 非對稱加密實戰&#xff1a;Python實現數字簽名引言&#xff1a;數字世界的身份驗證1. 非對稱加密基礎1.1 核心概念1.2 非對稱加密算法比較 2. 數字簽名原理2.1 數字簽名工作流程2.2 數字簽名的核心特性 3. RSA數字簽名實現3.1 RSA算法數學基礎3.1.1 密鑰生成3.1.2 簽名生…

優化提示詞的常用技巧

優化提示詞的常用技巧 1. 告訴AI你需要的重要要素 &#xff08;1&#xff09;風格&#xff1a;明確語言風格 優化前&#xff1a;寫一篇人工智能的介紹。優化后&#xff1a;寫一篇100字的人工智能介紹&#xff0c;受眾是小學生&#xff0c;語言幽默。 &#xff08;2&#xf…

PyTorch實戰(12)——StyleGAN詳解與實現

PyTorch實戰(12)——StyleGAN詳解與實現 0. 前言1. StyleGAN1.1 模型介紹1.2 模型策略分析2. 實現 StyleGAN2.1 生成圖像2.2 風格遷移小結系列鏈接0. 前言 StyleGAN (Style-Generative Adversarial Networks) 是生成對抗網絡 (Generative Adversarial Networks, GAN) 的變體…

XML重復查詢一條Sql語句??怎么解決

一、核心問題&#xff1a;從SQL重復執行到日志失效 1. 首要現象&#xff1a;XML重復查詢失效 在排查服務性能時發現&#xff1a; <!-- MyBatis XML片段 --> <select id"List" resultMap"Map"> SELECT * FROM user WHERE name #{name} …

量化面試綠皮書:33. 不公平的硬幣

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 33. 不公平的硬幣 你有1000枚硬幣。 其中&#xff0c;有1枚硬幣正反兩面都是正面。 其他的999枚硬幣都是公平的硬幣。 你隨機選擇一枚硬幣并…

Java 期末考試題

1. 如果將類 MyClass 聲明為 public&#xff0c;它的文件名必須是 ( ) 才能正常編譯。 解&#xff1a;① 如果一個類被聲明為 public&#xff0c;則必須以 .java 作為文件拓展名。 答案&#xff1a;MyClass.java 2. 定義類頭時能使用的修飾符是&#xff08; &#xff09;…

跨標簽頁通信(三):Web Storage

在現代 Web 應用中&#xff0c;跨標簽頁通信的需求越來越普遍。無論是實現多標簽頁之間的數據同步&#xff0c;還是構建實時協作功能&#xff0c;跨標簽頁通信都能極大地提升用戶體驗。今天&#xff0c;我們將探討一種簡單而高效的實現方式&#xff1a;Web Storage。 一、什么…