欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++與c中的數(shù)組初始化默認(rèn)值如何為0

 更新時(shí)間:2023年08月09日 09:26:22   作者:25zhixun  
這篇文章主要介紹了c++與c中的數(shù)組初始化默認(rèn)值如何為0問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

c++與c中的數(shù)組初始化默認(rèn)值如何為0

做全局變量

int sum[1000006];//初始化設(shè)默認(rèn)值為0

做局部變量

默認(rèn)值只能設(shè)為0,且只有在初始化時(shí),才能設(shè)為0(sum[100]={0};這么寫就是錯(cuò)的);

如果設(shè)為1,則只是sum[0]是1,其他默認(rèn)全為0;

int sum[100]={0};//只能設(shè)為0

遍歷賦值

實(shí)際意思和循環(huán)賦值0,是一樣的,只不過這個(gè)是庫封裝好了的方法。

#include <cstring>//必須引用
memset(sum,0,sizeof(sum));

c++與c數(shù)組初始化的一些誤區(qū)

以前我這樣初始化一個(gè)數(shù)組,并自我感覺良好:

int a[5] = { 0 };    // 全部初始化為0

這種簡單的寫法讓我非常爽,于是我又想把數(shù)組全部初始化為1:

int a[5] = { 1 };    // 我想全部初始化為1

直到十分鐘前,我都以為這句代碼確實(shí)能夠?qū)ⅲ祩€(gè)元素全部初始化為1,但事實(shí)跟我想的完全不同?。ɑA(chǔ)的東西革命的本錢,疏漏不得?。?/p>

全部初始化為0的那行代碼確實(shí)是沒問題的,可以正常工作。問題就出在想把數(shù)組全部初始化成一個(gè)非0的數(shù),即非默認(rèn)值,是行不通的(查看內(nèi)存發(fā)現(xiàn),只有數(shù)組的第一個(gè)元素被初始化為1,其他全為0)。這倒不是因?yàn)榫幾g器對(duì)初始化為0給了個(gè)后門,而是因?yàn)橐粭l基本語法規(guī)則:

數(shù)組初始化列表中的元素個(gè)數(shù)小于指定的數(shù)組長度時(shí),不足的元素補(bǔ)以默認(rèn)值。

對(duì)于基本類型int來說,當(dāng)然就是補(bǔ)int()即0了。再看一下非基本類型的數(shù)組:

string a[5] = { "foo" };

有了上面的規(guī)則,就很容易知道其實(shí)相當(dāng)于:

string a[5] = { "foo", "", "", "", "" };

即后面4個(gè)元素調(diào)用了string的默認(rèn)構(gòu)造函數(shù)進(jìn)行的初始化,而第一個(gè)則調(diào)用的string::string(const char*)進(jìn)行的初始化。

還有一個(gè)區(qū)別:

int a[5];
string a[5];

如果不明確指出初始化列表,那么基本類型是不會(huì)被初始化的(除全局變量和靜態(tài)變量外),所有的內(nèi)存都是“臟的”;而類類型則會(huì)為每個(gè)元素調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化。

注意,在C++11中中間的賦值號(hào)可以省略,即 int a[5]{1}; 并且,如果初始化列表為空,如 int a[5]{},那將初始化所有元素為默認(rèn)值,即與 int a[5]{0}; 等價(jià)

動(dòng)態(tài)數(shù)組的初始化

說完了棧中的數(shù)組的初始化,我發(fā)現(xiàn)new一個(gè)數(shù)組和其又有一些不同:

int* a = new int[5];
string* a = new string[5];
int* a = new int[5] { 0 };
string* a = new string[5] { "foo" };

上面幾行代碼遵循棧中數(shù)組的初始化規(guī)則,除此之外這里還有一個(gè)新語法:

int* a = new int[5]();

注意后面的一對(duì)圓括號(hào),它的意思是使用默認(rèn)值初始化整個(gè)數(shù)組,所以對(duì)于類類型來說,new string[5] 與 new string[5]()是等價(jià)的,都會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化;但是對(duì)于基本類型就不同了,new int[5]根本不會(huì)初始化,而new int[5]() 則會(huì)使用int()的值即0進(jìn)行初始化。

看到這對(duì)圓括號(hào),我想它該不會(huì)是元素的構(gòu)造函數(shù)的參數(shù)列表吧,那么我可能會(huì)想將數(shù)組全部初始化為1:new int[5](1); 看起來很合理,但其實(shí)不行。事實(shí)上這對(duì)圓括號(hào)不是數(shù)組元素的構(gòu)造參數(shù), 可能是整個(gè)數(shù)組的,它有三個(gè)重載版本:

看起來像是常引用、右值引用、和默認(rèn)版本。所以假如已經(jīng)有一個(gè)相同大小的數(shù)組b,試著用b來初始化a:

int* a = new int[5](b);

結(jié)果編譯出錯(cuò),提示

error C3074: an array cannot be initialized with a parenthesized initializer

看來這個(gè)括號(hào)的作用和我想的不一樣,其實(shí)也應(yīng)該看出來的,要是是用另一個(gè)數(shù)組初始化的話那么參數(shù)應(yīng)該是const int (&)[5] 而不是 const int [5] &,而且后者好像是一個(gè)錯(cuò)誤的類型。這個(gè)問題暫時(shí)無解。

錯(cuò)過了初始化時(shí)機(jī)(memset的誤區(qū))

如果想在數(shù)組創(chuàng)建結(jié)束后再對(duì)其進(jìn)行初始化,可以使用C函數(shù)memset(),但是memset的使用有個(gè)大問題,就是它只對(duì)char類型的數(shù)組管用:

char a[10];
memset(a, 1, 10); ? ?// 將每個(gè)元素設(shè)置為1

如果將上面的a數(shù)組換成int或其他類型的,就會(huì)出現(xiàn)問題,因?yàn)閙emset的內(nèi)部實(shí)現(xiàn)是以字節(jié)為單位進(jìn)行賦值的,int 類型大于一個(gè)字節(jié)(假設(shè)是4個(gè)),數(shù)組內(nèi)存連續(xù),如果有下面代碼:

int a[10];
memset(a, 1, sizeof(a));

將只會(huì)對(duì)前sizeof(a)即 40個(gè)字節(jié)進(jìn)行賦值1的操作,即給“前5個(gè)int”進(jìn)行了賦值0x01010101的操作,失之毫厘謬以千里!

如果實(shí)在想再初始化,那么老老實(shí)實(shí)循環(huán)賦值吧。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++標(biāo)準(zhǔn)庫中sstream與strstream的區(qū)別詳細(xì)解析

    C++標(biāo)準(zhǔn)庫中sstream與strstream的區(qū)別詳細(xì)解析

    以下是對(duì)C++標(biāo)準(zhǔn)庫中sstream與strstream的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法

    VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法

    這篇文章主要介紹了VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C++?OpenCV技術(shù)實(shí)戰(zhàn)之身份證離線識(shí)別

    C++?OpenCV技術(shù)實(shí)戰(zhàn)之身份證離線識(shí)別

    OpenCV身份證離線識(shí)別技術(shù)的主要技術(shù)就是通過OpenCV找到身份證號(hào)碼區(qū)域,然后通過OCR進(jìn)行數(shù)字識(shí)別該區(qū)域的截圖即可得到身份證號(hào)碼。感興趣的可以了解一下
    2021-12-12
  • C++中的基類和派生類構(gòu)造函數(shù)示例詳解

    C++中的基類和派生類構(gòu)造函數(shù)示例詳解

    這篇文章主要介紹了C++的基類和派生類構(gòu)造函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • C++實(shí)現(xiàn)將長整型數(shù)轉(zhuǎn)換為字符串的示例代碼

    C++實(shí)現(xiàn)將長整型數(shù)轉(zhuǎn)換為字符串的示例代碼

    這篇文章主要介紹了C++實(shí)現(xiàn)將長整型數(shù)轉(zhuǎn)換為字符串的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • c語言實(shí)現(xiàn)一個(gè)簡單日歷

    c語言實(shí)現(xiàn)一個(gè)簡單日歷

    本文給大家分享的是一則使用C語言來實(shí)現(xiàn)的一個(gè)簡單日歷的代碼,根據(jù)項(xiàng)目需求,實(shí)現(xiàn)了3個(gè)簡單的小功能,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • 淺析C++宏定義里#和##的使用

    淺析C++宏定義里#和##的使用

    工作中如果是c開發(fā)的話,經(jīng)常會(huì)用到宏定義,而宏定義中的#和##也會(huì)時(shí)不時(shí)遇到,本文主要就來和大家分享一下這兩個(gè)符號(hào)的作用,需要的可以參考一下
    2023-05-05
  • 解決C++中重定義的方法總結(jié)

    解決C++中重定義的方法總結(jié)

    本篇文章是對(duì)C++中重定義的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中 type *(0)的具體使用

    C語言中 type *(0)的具體使用

    表達(dá)式?type * (0)?在 C/C++ 編程中是一個(gè)常見的技巧,通常用于內(nèi)核編程和一些系統(tǒng)編程場(chǎng)景中,本文主要介紹了C語言中 type *(0)的具體使用,感興趣的可以了解一下
    2024-08-08

最新評(píng)論