C C 程式設計 C風格陣列

2021-10-21 10:59:46 字數 4003 閱讀 4447

// a 與 b 擁有相同的 const 限定型別「const char 的 5 元素陣列」

typedef

const

char cc;

cc a[5]

=;typedef

char ca[5]

;const ca b =

;

new出來的數值也必須清理

int

* p =

newint[0

];// 訪問 p[0] 或 *p 是未定義的

delete

p;// 仍然要求清理

int a[3]

=, b[3]

=;int(

*p)[3]

=&a;

a = b;

// 錯誤:a 是陣列

struct

s1, s2 =

;s1 = s2;

// ok:隱式定義的複製賦值運算子可對陣列型別的資料成員賦值

存在從陣列型別的左值和右值到指標型別的右值的隱式轉換:它構造乙個指向陣列首元素的指標。凡在陣列出現於不期待陣列而期待指標的語境中時,均使用這個轉換:

#include

#include

#include

voidg(

int(

&a)[3]

)voidf(

int* p)

intmain()

;int

* p = a;

std::cout <<

sizeof a <<

'\n'

// 列印陣列的大小

<<

sizeof p <<

'\n'

;// 列印指標的大小

// 在可接受陣列,而不可接受指標處,只能使用陣列

g(a)

;// ok:函式以引用接受陣列

// g(p); // error

for(

int n: a)

// ok:陣列可用於範圍 for 迴圈

std::cout << n <<

' ';

// 列印陣列的各個元素

// for(int n: p) // 錯誤

// std::cout << n << ' ';

std::

iota

(std::

begin

(a), std::

end(a),7

);// ok:begin 與 end 接受陣列

// std::iota(std::begin(p), std::end(p), 7); // 錯誤

// 在可接受指標,而不可接受陣列處,都可以使用

f(a)

;// ok:函式接受指標

f(p)

;// ok:函式接受指標

std::cout <<

*a <<

'\n'

// 列印首元素

<<

*p <<

'\n'

// 相同

<<

*(a +1)

<<

' '<< a[1]

<<

'\n'

// 列印第二元素

<<

*(p +1)

<<

' '<< p[1]

<<

'\n'

;// 相同

當陣列的元素型別是另一陣列時,稱該陣列是多維的:

// int 的 3 元素陣列的 2 元素陣列

int a[2]

[3]=

,};// 可視作 2 × 3 矩陣,以行為主布局

注意,應用陣列到指標退化時,多維陣列轉換成指向其首元素的指標(例如,指向其首行或首平面的指標):陣列到指標退化僅應用一次。

int a[2]

;// int 的 2 元素陣列

int* p1 = a;

// 退化到指向 a 首元素的指標

int b[2]

[3];

// int 的 3 元素陣列的 2 元素陣列

// int** p2 = b; // 錯誤:b 不退化到 int**

int(

*p2)[3

]= b;

// b 退化到指向 b 的首個 3 元素行的指標

int c[2]

[3][

4];// int 的 4 元素陣列的 3 元素陣列的 2 元素陣列

// int*** p3 = c; // 錯誤:c 不退化到 int***

int(

*p3)[3

][4]

= c;

// c 退化到指向 c 首個 3 × 4 元素平面的指標

如果在陣列宣告中省略表示式,則宣告的型別是「t的位置邊界陣列」,這是一種不完整型別,除非在宣告名帶有「聚合初始化器」

extern

int x;

// x 的型別是「int 的未知邊界陣列」

int a=

;// a 的型別是「int 的 3 元素陣列」

因為陣列元素不能具有未知邊界陣列型別,故多維陣列除了第乙個之外維度中不能有未知邊界:

extern

int a[

2];// ok:int 的 2 元素陣列的未知邊界陣列

extern

int b[2]

;// 錯誤:陣列有不完整型別

可以構成到未知邊界陣列的引用和指標,但不能從已知邊界的陣列或指向已知邊界陣列的指針對其初始化或賦值。注意在 c 程式語言中,指向未知邊界陣列的指標與指向已知邊界陣列的指標相容,從而可以雙向轉換、賦值。

extern

int a1;

int(

&r1)

= a1;

// ok

int(

*p1)

=&a1;

// ok

int(

*q)[2]

=&a1;

// 錯誤(但 c 中 ok)

int a2=

;int

(&r2)

= a2;

// 錯誤

int(

*p2)

=&a2;

// 錯誤(但 c 中 ok)

儘管陣列無法從函式按值返回,且不能作為大多數轉型表示式的目標,陣列純右值亦可通過使用型別別名構成,並用花括號初始化的函式式轉型來構造陣列的臨時量。

(c++17 起) 與類的純右值類似,陣列的純右值由臨時量實質化在求值時轉換成亡值。

可以由訪問類右值的陣列成員,或用 std::move 或其他返回右值引用的轉型或函式呼叫,直接構成陣列的亡值

#include

#include

#include

voidf(

int(

&&x)[2

][3]

)struct x

x;template

<

typename t>

using identity = t;

intmain()

);// ok:繫結到純右值

f(identity<

int[

3]>,}

);// ok:繫結到純右值

c c 程式設計風格

1.程式設計風格 請寫出 bool flag 與 零值 比較的 if 語句。3分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if flag 0 請寫出 float x 與 零值 比較的 if 語句...

C程式設計風格

問 如何在原始檔中合理分配函式?答 通常,相關的函式放在同乙個檔案中。有時候 例如開發庫的時候 乙個原始檔 自然也 就是乙個目標檔案 放乙個函式比較合適。有時候,尤其是對某些程式設計師,太多的原始檔可能 會很麻煩,將多數以至所有的程式都放入少數幾個大的原始檔中也很誘人,甚至也是合適的。希望用 sta...

C 程式設計風格約定

我一直自認為,自己在程式設計功力還算說的過去,昨天乙個老師看了我以前寫的 說功力還需加強 當時我很鬱悶,其實我知道的可能還比他多 很多時候我們 都太注重高水平 尖端的技術,其實很多公司叫你寫一段簡單的程式,可能就會決定要不要你。他們是從 中看出了你的閱歷,你的水平。這些水平不是體現你的 尖端技術 況...