C 17基本教程 第6講 陣列 (tcy)

2021-10-11 18:05:27 字數 3496 閱讀 6378

1.1.說明:

1)普通陣列無邊界檢查,訪問不夠方便,應用或替代

2)陣列宣告必用常量表示式;禁用變數;記憶體是連續的

3)初始化陣列元素個數必須<=陣列元素個數;沒提供元素系統初始化為0,0.0,\0

只需給首元素賦值0剩餘元素會自動初始化為 0( int arr[3]{} == int arr[3]= )

必須顯式指定除第一維之外的全部陣列維數;避免幻數-定義常量n

只能給元素逐個賦值不能給陣列整體賦值 int a[10] = 1;錯誤

1.2.定義:

arrayarr 替代:int a[rows]

array, rows> arr 替代:int a[rows][cols]

array, rows>, channels>arr 替代:int a[channels][rows][cols]

1.3.訪問:

arr.at(i);(arr[i]無邊界檢查) 替代:a[i];*(p+i);p=a=&a[0];

arr.at(row).at(col);(arr) 替代:a[r][c];*(p + r*cols+c);p=&a[0][0];

arr.at(channel).at(row).at(col);(arr)替代:a[ch][r][c];*(p+ch*rows*cols+r*cols+c);p=&a[0][0][0];

1.4.陣列大小:

int arr[6]{}; //所有元素初始化為0

int arr;//用初始化列表定義陣列大小

std::size(arr)==size(arr)/sizeof(arr[0]);

1.5注意:

1)& a[i][j] = &a[0][0] + i * sizeof(int)*n + j * sizeof(int);

2)*p++ = *(p++);先取第 n 元素值再將 p 指向下一元素

3)*++p = *(++p);//先進行++p運算,使得p值增加指向下一元素

相當 *(p + 1)獲得第n +1個陣列元素的值

4)sizeof 禁用函式,不完全型別(未知儲存大小資料型別(陣列, 結構, 聯合, void )與位欄位

獲取陣列的長度時不要對指標應用 sizeof 操作符

2.例項: 

例項1.1:陣列初始化

int a=;

int a[2][3] = ;

int arr,} //錯誤

int a[3] = ,}; //不足部分用0來填補;

int a[2][3] = , }, } };

int a[2][2][3] = , },, } };

int a[2][2][3] = ;

int a[2][2][3] = ; //利用元素指示符

int a[2][2][3] = ,[0][1] = ,[1][0] = }; //等價上面

int arr[3][4],,},

,,}};

例項1.2:

void view_array_2d();

int* p2 = &arr2[0][0];

for (long long i1 = 0; i1 < 3; i1++)//cout << arr2[i1][i2] << ",";等效

cout << endl;

} }

void view_array_3d();

int* p = &arr3[0][0][0];

for (long long i1 = 0; i1 < 2; i1++)//cout << arr3[i1][i2][i3] << ",";等效

cout << endl;

}cout << endl;

} }

例項2.1:array替換普通陣列

constexpr size_t rows, cols, channels;

void view_array_1d();arr.at(2) = 3;

for (auto v : arr)cout << v << ",";

cout << endl;//1,2,3,

}

void view_array_2d()};等價

array, rows> arr2,,} };

arr2.at(0).at(2) = 13; arr2[0][3] = 14;

for (auto v : arr2) }

/* 11, 12, 13, 14,

21, 22, 23, 0,

31, 32, 33, 34,

*/

void view_array_3d(),,}},

//,//等效上面

} };

//array, rows>, channels>arr3 };//等效上面

arr3.at(0).at(1).at(2)=-1;//channel=0,row=1,col=2

arr3[0][1][2] = -1; //等效上面但不做邊界檢查

for (auto v : arr3)//cols

cout << endl;

}

cout << endl;

}} /*

11, 12, 13, 14,

21, 22, -2, 24,

31, 32, 33, 34,

41, 42, 43, 44,

51, 52, 53, 54,

61, 62, 63, 64,

*/

例項3:c語言陣列

#include#includeint main()

return 0;

}

3.備註:指標與陣列的區別                               

3.1.指標變數int *p:

1)是變數儲存資料是位址;可進行數值運算

2)*,運算子可用作陣列指標*a=a[0]=*(p+i)=p[0]=2

3.2.陣列變數int a[2]:

1)代表陣列最首元素位址;不可數值運算

2)陣列變數是特殊的指標,陣列變數本身表達位址p = a= &a[0] ;

3)陣列變數無需用取址符& ; a[i]==*(a+i);sizeof(a) == sizeof(int *)

4)實際上陣列是 const 指標不能被賦值

int a = ; int b;// int b實質上等價於int const *b;

b是常數不能被改變,初始化出來代表這個陣列就不能再改變

b = a; (錯誤) 陣列變數之間不可互相賦值。 int *q = a;是可以

C 教程第8講委託2(學習筆記)

第8講 委託2 快樂喬巴的部落格 張三李四王五在吃東西,這時候如果馬六陳七也加入進來吃東西,我們按照上面的邏輯就必須再寫2個靜態方法。如果有10個人吃東西,那麼我們就要增加10個靜態方法。如果100個人吃東西,就要.這樣的 很明顯非常的不合理。這時候我們就可以考慮對這些方法進行一些包裝,通過觀察每個...

c 第6次實驗 陣列操作

一 問題及 檔名稱 陣列操作 作 者 舒新 完成日期 2016 年 5 月 22 日 版 本 號 v1.0 對任務及求解方法的描述部分 使用陣列,排序,刪除和增加 輸入描述 1 0 0 問題描述 使用陣列,排序,刪除和增加 程式輸出 2 4 6 7 8 9 10 11 13 0 2 4 6 7 8 ...

C 第6次實驗 陣列操作

一 問題及 檔名稱 作 者 李憲 完成日期 2016年5月24日 版 本 號 v1.0 對任務及求解方法的描述部分 專案1 陣列操作 輸入描述 專案1 陣列操作 定義乙個不重複的有初值的10個元素的整數陣列a,利用冒泡法對陣列a排序後完成以下操作 寫在乙個程式中 1。從鍵盤中輸入乙個數x,刪除a陣列...