首頁 > 後端開發 > C#.Net教程 > c++數組怎麼初始化

c++數組怎麼初始化

青灯夜游
發布: 2022-12-01 17:31:29
原創
25425 人瀏覽過

c 初始化陣列的方法:1、先定義陣列再給陣列賦值,語法「資料型別數組名[length];陣列名[下標]=值;」;2、定義陣列時初始化陣列,語法“資料型別數組名[length]=[值列表]”。

c++數組怎麼初始化

本教學操作環境:windows7系統、C 17版本、Dell G3電腦。

有時在程式中設定變數值比輸入變數值更合適。但是,為數組的各個元素編寫單獨的賦值語句可能意味著大量的輸入,對於大型數組而言尤其如此。

例如,來看一個程式:

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    const int NUM_MONTHS = 12;
    int days[NUM_MONTHS];
    days[0] = 31; // January
    days[1] = 28; // February
    days[2] = 31; // March
    days[3] = 30; // April
    days[4] = 31; // May
    days[5] = 30; // June
    days[6] = 31; // July
    days[7] = 31; // August
    days[8] = 30; // September
    days[9] = 31; // October
    days[10] = 30; // November
    days[11] = 31; // December
    for (int month = 0; month < NUM_MONTHS; month++)
    {
        cout << "Month "<< setw (2) << (month+1) << " has ";
        cout << days[month] << " days.\n";
    }
    return 0;
}
登入後複製

程式輸出結果:

Month  1 has 31 days.
Month  2 has 28 days.
Month  3 has 31 days.
Month  4 has 30 days.
Month  5 has 31 days.
Month  6 has 30 days.
Month  7 has 31 days.
Month  8 has 31 days.
Month  9 has 30 days.
Month 10 has 31 days.
Month 11 has 30 days.
Month 12 has 31 days.
登入後複製

幸運的是,還有一個選擇,C 允許在定義陣列時初始化陣列。透過使用初始化列表,可以在建立數組時輕鬆初始化數組的所有元素。以下語句定義days 數組,並使用先前程式中賦值語句集所建立的相同值對其進行初始化:

int days [NUM_MONTHS] = {31,28,31,30,31,30,31,31,30,31,30, 31};
登入後複製

這些值按照它們出現在列表中的順序儲存在數組元素中(第一個值31 儲存在days[0]  中,第二個值28 儲存在days [1] 中,等等)。下圖 顯示了初始化後陣列的內容。

c++數組怎麼初始化

下面程式是上邊程式的修改版。它在創建 days 數組時即對其進行了初始化,而不是使用單獨的賦值語句。請注意,初始化列表分散在多行中。程式還添加了一個string 物件數組來保存月份名稱:

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
    const int NUM_MONTHS = 12;
    string name[NUM_MONTHS]={ "January", "February", "March", "April", "May" , "June", "July", "August", "September", "october", "November", "December"};
    int days[NUM_MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for (int month = 0; month < NUM_MONTHS; month++)
    {
        cout << setw(9) << left << name[month] << " has ";
        cout << days [month] << " days. \n";
    }
    return 0;
}
登入後複製

程式輸出結果:

January   has 31 days.
February  has 28 days.
March     has 31 days.
April     has 30 days.
May       has 31 days.
June      has 30 days.
July      has 31 days.
August    has 31 days.
September has 30 days.
october   has 31 days.
November  has 30 days.
December  has 31 days.
登入後複製

到目前為止,已經示範如何使用數值填充數組,然後顯示所有的值。但是,有時候可能還需要更多功能,例如從陣列中檢索一個特定的值。下面程式是上面程式的變更版本,它可以顯示使用者選擇的月份中有多少天。

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
    const int NUM_MONTHS = 12;
    int choice;
    string name[NUM_MONTHS]={ "January", "February", "March", "April", "May" , "June", "July", "August", "September", "october", "November", "December"};
    int days[NUM_MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    cout << "This program will tell you how many days are "<< "in any month.\n\n";
    // Display the months
    for (int month = 1; month <= NUM_MONTHS; month++)
        cout << setw (2) << month << " " << name [month-1] << endl;
    cout << "\nEnter the number of the month you want: ";
    cin >> choice;
    // Use the choice the user entered to get the name of
    // the month and its number of days from the arrays.
    cout << "The month of " << name [choice-1] << " has " << days[choice-1] << " days.\n";
    return 0;
}
登入後複製

程式輸出結果為:

This program will tell you how many days are in any month.

1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 october
11 November
12 December

Enter the number of the month you want: 4
The month of April has 30 days.
登入後複製

從陣列元素1開始

真實世界中存在著大量的邏輯上以1 開頭的事物,在給這樣的事物建立模型時,很多教師會偏向於讓學生不要使用元素0,而改為從元素1 開始儲存實際資料。一年中的月份數就是一個很好的例子。在這種情況下,可以宣告 name 和 days 陣列每個都有 13 個元素,並以下列方式對它們進行初始化:

string name[NUM_MONTHS+1]={" ", "January", "February", "March", "April", "May" , "June", "July", "August", "September", "october", "November", "December"};
int days[NUM_MONTHS+1] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
登入後複製

注意陣列元素 0 沒有被使用。它只是一個虛擬的值。這樣可以將一月份的名稱儲存在 name[1] 中,二月的名稱將儲存在 name[2] 中,以此類推。同樣,1 月份的天數將保存在 days[1] 元素中,2 月份的天數將保存在 days[2] 元素中,以此類推。

如果使用上述方法定義和初始化數組,則循環應該改寫為以下形式。它將顯示陣列元素 1〜12 的內容,而不是像以前那樣顯示元素 0〜11。

for (int month = 1; month <= NUM_MONTHS; month++)
{
    cout << setw(9) << left << name[month] << " has ";
    cout << days[month] << " days.\n";
}
登入後複製

如果實際資料以元素 1 開始存儲,那麼也不需要將數組下標加 1 來定位特定的資料。以下是列出每個月編號和名稱的語句修改:

for (int month = 1; month <= NUM_MONTHS; month++)
    cout << setw (2) << month << " " << name [month] << endl;
登入後複製

顯示使用者所選月份的天數的代碼應修改為如下所示。

cout << "The month of " << name[choice] << " has "<< days [choice] << " days . \n";
登入後複製

陣列部分初始化

當一個陣列被初始化時,C 並不是必須取得每個元素的值,也可以只初始化陣列的一部分,如下所示:

int numbers[7] = {1, 2, 4, 8};
登入後複製

這個定義只初始化了一個7元素陣列中的前4 個元素,如下圖所示。

c++數組怎麼初始化
圖 2

值得一提的是,圖 2 中未初始化的元素將會全部被設定為零。這是數字數組部分初始化時發生的情況。當一個 string 物件陣列被部分初始化時,未初始化的元素將全部包含空字串,即長度為 0 的字串。即使部分初始化的陣列在局部定義,也會如此。但是,如果本地數組完全未初始化,則其元素將包含“垃圾”,就像其他局部變數一樣。

下面的程式顯示了在部分初始化之後的numbers 陣列的內容:

#include <iostream>
using namespace std;
int main ()
{
    const int SIZE = 7;
    int numbers[SIZE] = {1, 2, 4, 8}; // Initialize the first 4 elements
    cout << "Here are the contents of the array: \n";
    for (int index = 0; index < SIZE; index++)
    cout << numbers [index] << " ";
    cout << endl;
    return 0;
}
登入後複製

程式輸出結果:

Here are the contents of the array:
1 2 4 8 0 0 0
登入後複製

雖然陣列初始化列表的值可以比陣列的元素少,但不允許有比數組元素更多的值。以下語句是非法的,因為 numbers 陣列只能包含 7 個值,但初始化清單中卻包含 8 個值。

int numbers [7] = {1, 2, 4, 8, 3, 5, 7, 9};    //不合法
登入後複製

另外,如果留下了某個元素未初始化,那麼該元素之後的所有元素都應該保留為未初始化。 C 不提供跳過初始化清單中元素的方法。以下是另一個非法的例子:

int numbers [7] = {1, , 4, , 3, 5, 7};    // 不合法
登入後複製

隱含陣列大小

#

可以通过提供一个包含每个元素值的初始化列表来定义一个数组而不指定它的大小。C++ 会计算初始化列表中的项目数,并为数组提供相应数量的元素。例如,以下定义创建 了一个包含5个元素的数组:

double ratings [] = {1.0,1.5,2.0,2.5,3.0};
登入後複製

注意,如果省略大小声明符,则必须指定一个初始化列表。否则,C++ 不知道该数组有多大。

初始化变量的新方法

到目前为止,已经介绍过的定义和初始化常规变量的方法是使用赋值语句,示例如下:

int value = 5;
登入後複製

但是,我们已经学习过使用函数、数组以及类,所以现在是时候来介绍另外两种在定义变量的同时即进行初始化的方法。

第一种新方法是使用函数符号初始化变量。它看起来就像是给一个函数传递参数。如果您已经掌握了类的内容,那么就会注意到,它也很像是在创建类对象时给一个构造函数传递值。以下是使用函数符号定义变量 value 并初始化其值为 5 的示例语句:

int value (5);
登入後複製

第二种初始化变量的新方法是 C++ 11 中新引入的,使用大括号表示法。它看起来就像是刚刚上面所看到的初始化数组的方法,但是其中有两点区别:

  • 因为常规变量只能一次保存一个值,所以通过这种方法初始化变量时,大括号中只有一个值;

  • 和数组初始化列表不一样,通过这种方法初始化变量时,在大括号前面没有赋值运算符(=)。

以下是使用大括号表示法定义变量 value 并初始化其值为5的示例语句。

int value{5}; //该语句仅在C++ 11或更高版本中合法
登入後複製

绝大多数程序员会继续使用赋值运算符来初始化常规变量,本书也将如此,但是,大括号表示法提供了一项优点,它会检查用来初始化变量的值,并确保匹配变量的数据类型。例如,假设 doubleVal 是一个 double 类型变量,存储在其中的值为 6.2。则使用赋值运算符时,可以编写以下两种形式的语句之一:

int valuel = 4.9;    //该语句将给valuel赋值为。4
int vaule2 = doubleVal;    // 该语句将给 value2 赋值为 6
登入後複製

在这两种情况下,值的小数点部分都会被先截断,然后才赋值给被定义的变量。这虽然可能会导致一些问题,但 C++ 编译器是允许的,它也会提出警告,但却仍然能生成可执行文件,并且可以运行。不过,如果在这里使用的是大括号表示法,则编译器会指出这些语句产生了一个错误,并且不会生成可执行文件。必须先修复该错误,然后重新编译项目才能运行该程序。

相关推荐:《C++视频教程

以上是c++數組怎麼初始化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板