C語言-數組(定義、初始化和使用)

来源:https://www.cnblogs.com/liangfenqian/archive/2022/07/24/shuzu.html
-Advertisement-
Play Games

1 數組 1.1 數組概念 簡單來說,普通變數只能存取單個數據元素,與之不同,數組可以存取多個數據元素,記憶體中數組以順序結構存儲。 定義1:(數組) 同一類型數組中存取的元素類型相同,並且各個元素之間連續存儲。 1.2 整形數組 1.2.1 一維數組 (1)定義方式 類型說明符 數組名[常量表達式] ...


1  數組

1.1  數組概念

簡單來說,普通變數只能存取單個數據元素,與之不同,數組可以存取多個數據元素,記憶體中數組以順序結構存儲。

定義1:(數組) 同一類型數組中存取的元素類型相同,並且各個元素之間連續存儲。

1.2  整形數組

1.2.1  一維數組

(1)定義方式

類型說明符  數組名[常量表達式];

【例如】int  shuzu[10];   

定義一個大小為10的整形數組,只能存取int類型元素。記憶體地址連續分配,數組名 shuzu為數組的首地址,數組下標從0開始,shuzu+1表示數組第二個元素的地址,shuzu[2]表示為訪問shuzu的第3個元素值。 

(2)初始化

   數組初始化方式可分為四種。

   第一種(完全初始化):定義數組元素時,為所有元素賦初始值

【例如】int shuzu[10]={ 0,1,2,3,4,5,6,7,8,9};

   第二種(不完全初始化):定義數組元素時,為部分元素賦初始值

【例如】int shuzu[10]={ 0,1,2,3};   // 這裡只對數組前4個元素初始化,而數組後6個元素預設初始化為0;

   第三種:定義數組元素時,可以不指定常量表達式值(即不指定數組大小),數組大小由初始化確定

          例如:int shuzu[ ]={ 0,1,2,3};   // 表明當前數組大小為4

註意:

1、初始化過程中,常量表達式只能是常量,不能為變數 例如:int  n=10,  shuzu[10];  // 這種定義方式是錯誤的

          2、初始化過程中,int shuzu[10]={ };這種寫法是

          3、初始化過程中,int shuzu[ ];// 未指定數組大小,編譯錯誤

    第四種:在程式運行當中為數組元素動態賦值

           【例如】 

# include <stdio.h>
int main(void)
{
    int shuzu[10];
    int i;
    for (i=0; i<10; ++i)
    {
        scanf("%d", &shuzu[i]);   // 也可以寫成    scanf("%d", shuzu+i);
    }
    return 0;
}

(3)一維數組的使用

使用方式:數組名[下標]

規定:數組必須先定義和初始化才能使用,並且只能逐個引用數組元素

【例如】

# include <stdio.h>
int main(void)
{
    int shuzu[10]={ 0,1,2,3,4,5,6,7,8,9};  // 先定義並初始化
    int b;
    b=shuzu[1]+shuzu[2]+shuzu[2*3];  // 使用數組
    printf("%d",b);
}

1.2.2  二維數組

(1)定義方式

類型說明符  數組名[常量表達式1][常量表達式];

【例如】int  shuzu[2][3];   

定義一個2行3列的整形數組,數組大小為2*3=6,只能存取int類型元素。

類似於一維數組,行和列下標都是從0開始,記憶體地址連續分配,按行順序存取,shuzu[0][0]表示第一個元素(即第一行第一列的元素),shuzu[0][1](即第一行第二列的元素)表示第二個元素,以此類推。

二維數組看作為由一維數組組成,如,shuzu[2][3]總共包含三個元素,每個元素由長度為3的一維數組組成。

 難點:以指針形式看待定義的二維數組

數組名 shuzu 為二維數組的首地址(等於 shuzu第一行第一列元素首地址、也等於 shuzu的第一行元素的首地址),&shuzu[0][0]表示shuzu第一行第一列元素首地址,shuzu[0] 表示 shuzu的第一行元素的首地址。shuzu+1表示數組第二行元素的首地址。

         【例如】

# include <stdio.h>
int main(void)
{
    int shuzu[2][3]={{1,2,3},{4,5,6}};  // 先定義並初始化
    printf("shuzu的地址為%d\n",shuzu);
    printf("shuzu[0][0]的地址為%d\n",&shuzu[0][0]);
    printf("shuzu+1的地址為%d\n",shuzu+1);
    printf("shuzu[0]的地址為%d\n",shuzu[0]);   
}

程式執行結果

因此,數組名 shuzu可看做指針的指針,shuzu[0] 可看作為指針, 

(2)初始化

數組初始化方式可分為三種。

第一種(完全初始化):定義數組元素時,為所有元素賦初始值

方式一:【例如】  int shuzu[2][3]={{1,2,3},{4,5,6}};  //  每行寫在花括弧內

方式二:【例如】  int shuzu[2][3]={1,2,3,4,5,6}};     //   將所有元素寫在同一個括弧內

第二種(不完全初始化):定義數組元素時,為部分元素賦初始值

【例如】int shuzu[2][3]={{1,2},{4,5 }};  // 這裡只對數組的部分元素初始化,其餘元素預設初始化為0;

第三種:定義數組元素時,可以不指定常量表達式值(即不指定數組大小),數組大小由初始化確定

【例如】 int shuzu[2][3]={1,2,3,4,5,6}};    等價於   int shuzu[][3]={1,2,3,4,5,6}};

第四種:在程式運行當中為數組元素動態賦值

【例如】

# include <stdio.h>
int main(void)
{
    int shuzu[2][3];
    int i;  //行迴圈變數
    int j;  //列迴圈變數
    for (i=0; i<2; ++i)
    {
        for (j=0; j<3; ++j)
        {
            scanf("%d", &shuzu[i][j]);
        }
    }
    return 0;
}

(3)二維數組的使用

使用方式:數組名[下標][下標]

規定:數組必須先定義和初始化才能使用,並且只能逐個引用數組元素

【例如】

# include <stdio.h>
int main(void)
{
    int shuzu[2][3];
    int i,j; 
    int b,c=1;
    for (i=0; i<2; ++i)
    {
        for (j=0; j<3; ++j)
        {
            scanf("%d", &shuzu[i][j]);
        }
    }
    b=shuzu[c][2]+shuzu[0+1][1*2];
    printf("%d",b);
    return 0;
}         

1.3  字元數組

1.3.1 定義方式

定義2:(字元數組)  char 數組名[數據長度] 

字元數組用於存放字元或者字元串 每個元素占用1位元組,。

註意:C語言沒有定義字元串類型,字元串常存放於字元數組當中。

【例如】char shuzu[10];

由於字元型數據在記憶體中以整數(ASCII碼)存儲,因此,也可以採用整形數組存放字元型數據。

例如: int shuzu[10];

然而,這時所占每個元素所占記憶體為4位元組。

1.3.2 初始化

(1) 字元常量初始化數組

當字元數組存放字元時,與整形數組初始化方式相同。

【例如】char shuzu[10]={'z','i','f','u','s','h','u',' ','z','u'};

把10個字元依次分別賦給shuzu[0]~shuzu[9]這10個元素。 同整形數組,定義字元數組時,必須將其初始化。 初始化時字元個數小於數組長度,先將字元賦予數組前邊的元素,剩餘元素則被賦予空字元(即'\0')。相同時,系統依據初始字元數確定數組長度。 例如:char a []={'z','f','s','z'}; // 數組長度為4

(2) 字元串常量初始化數組

【例如】char shuzu[10]={'z','i','f','u','s','h','u',' ','z','u'};採用字元串常量初始化,

可寫為 char shuzu[ ]={"zifushu zu"}; 也可寫為char shuzu[ ]="zifushu zu"; 

註意:此時數組shuzu的長度不是10,而是11。因為字元串常量的最後由系統加上一個'\0'。上面的初始化與下麵的初始化等價。 char shuzu[10]={'z','i','f','u','s','h','u',' ','z','u','/0'};  

1.3.3 字元數組引用

(1)引用方式

數組名[下標] 【例如】 輸入"wo shi zi fu shu zu"並輸出。 #include<stdio.h>
int main(void)
{
char a[]="wo shi zi fu shu zu";
int i;
while (a[i]!='\0'){
     printf("%c",a[i]);
     i++;
}}
也可寫為 #include<stdio.h>
#include<String.h>
int main(void)
{
char a[]="wo shi zi fu shu zu";
int i,len;
len=strlen(a); 
for(i=0;i<len;i++)
printf("%c",a[i]);
} 結果為

1.3.4 輸入和輸出

(1)字元數組的輸入

第一種方式:有getchar()或scanf() 的‘%c’兩種輸入

【例如】char shuzu[5] 用 getchar() 賦值 #include<stdio.h>
#include<string.h>
int main(void)
{
char shuzu[5];
int i;
for(i=0;i<5;i++)
shuzu[i]=getchar();
for(i=0;i<5;i++)
printf("%c",shuzu[i]);
}        當程式調用getchar()時,程式就等著用戶按鍵。用戶輸入的字元被存放在鍵盤緩衝區中,直到用戶按回車為止(回車字元也放在緩衝區中)。getchar可以從緩衝區讀走一個字元,相當於清除緩衝區 。 【例如】用scanf()賦值  #include<stdio.h>
int main(void)
{
char shuzu[5];
int i;
for(i=0;i<5;i++)
scanf("%c",&shuzu[i]);
for(i=0;i<5;i++)
printf("%c",shuzu[i]);
}

       在 scanf 中,從鍵盤輸入的一切數據,不管是數字、字母,還是空格、回車、Tab 等字元,都會被當作數據存入緩衝區。存儲的順序是先輸入的排前面,後輸入的依次往後排。按回車鍵的時候 scanf 開始進入緩衝區取數據,從前往後依次取。
       但 scanf 中 %d 只識別“十進位整數”。對 %d 而言,空格、回車、Tab 鍵都是區分數據與數據的分隔符。當 scanf 進入緩衝區中取數據的時候,如果 %d 遇到空格、回車、Tab 鍵,那麼它並不取用,而是跳過繼續往後取後面的數據,直到取到“十進位整數”為止。對於被跳過和取出的數據,系統會將它從緩衝區中釋放掉。未被跳過或取出的數據,系統會將它一直放在緩衝區中,直到下一個 scanf 來獲取。
       但如果是 %c,那麼任何數據都會被當作一個字元,不管是數字還是空格、回車、Tab 鍵它都會取回。

         第二種方式:以字元串形式輸入

                用scanf()的'%s'對數組賦值。

                scanf("%s",a);或scanf("%s“,&a[0]);

               輸入”zifuchuan“並回車時,a數組會自動包含一個以”\0“結尾的字元串”zifuchuan“。

#include<stdio.h>
int main(void)
{
char shuzu[5];
int i;
scanf("%s",&shuzu[0]);
printf("%s\n",shuzu);
}

(2)字元數組的輸出

  第一種方式:以字元形式輸入

  用putchar()或printf()的‘%c’格式符對數組進行字元賦值。   【例如】對於數組a[10]:用putchar()輸出: #include<stdio.h>
#include<string.h>
int main(void)
{
char shuzu[5];
int i,len;
scanf("%s",shuzu);
len=strlen(shuzu);
for(i=0;i<len;i++)
putchar(shuzu[i]);
} 第二種方式:以字元串形式輸出  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaScript進階內容——jQuery 我們在前面的文章中已經掌握了JavaScript的全部內容,現在讓我們瞭解一下JavaScript庫 這篇文章主要是為了為大家大致講解JavaScript庫以及使用方法,本篇不會完全講解jQuery的全部語法 如果希望完全掌握,可以參考網站jQuery ...
  • 概述 ​ SpringBoot中集成官方的第三方組件是通過在POM文件中添加組件的starter的Maven依賴來完成的。添加相關的Maven依賴之後,會引入具體的jar包,在SpringBoot啟動的時候會根據預設自動裝配的配置類的註入條件判斷是否註入該自動配置類到Spring容器中。自動配置類中 ...
  • 貪心演算法 一、 演算法概述 1、 簡介 貪心演算法,又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的演算法。[1]比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。 貪心演算法在有最優子結構的問題中尤為有效。最優子結 ...
  • PHP變數規則 變數以$符號開頭,其後是變數的名稱; 變數名稱必須已字母或者下劃線開頭; 變數名稱不能以數字開頭; 變數名稱只能包含字母數字字元和下劃線(A-z、0-9以及 _ ); 變數名稱對大小寫敏感($y和$Y是兩個不同的變數) 註釋:PHP變數名稱對大小寫敏感 創建PHP變數 PHP變數沒有 ...
  • java變數類型 1、局部變數 概念:類的方法中的變數 2、實例變數 概念:定義在類裡面,方法體、構造方法和語句塊外,且不被static修飾的變數,用於描述一個類中包含哪些數據 3、類變數 概念:獨立於方法之外的變數,有static修飾 public class able{ static int a ...
  • 基於SSM框架開發的CRM客戶管理系統,適合剛學完SSM的同學,幫助夯實javase到ssm之間的知識,提升學生的邏輯思維,也瞭解到企業軟體開發的流程及代碼編寫規範。 ...
  • 看《C++ Primer Plus》時整理的學習筆記,部分內容完全摘抄自《C++ Primer Plus》(第6版)中文版,Stephen Prata 著,張海龍 袁國忠譯,人民郵電出版社。只做學習記錄用途。 ...
  • 本文是在嘗試了刷新Maven項目、clean了Maven緩存並且重啟IDEA之後任然無法在Tomcat中找到子模塊對應的工件,這時就要試著模仿著自己創建一個模塊 父類的pom.xml模塊的配置,以及子模塊pom.xml的parent中寫的父模塊,這些都寫好了,在Tomcat中任然無法找到該模塊對應的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...