C++17基本教程 第6讲 数组 (tcy)
生活随笔
收集整理的這篇文章主要介紹了
C++17基本教程 第6讲 数组 (tcy)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.1.說明:1)普通數組無邊界檢查,訪問不夠方便,應用<array>或<vector>替代2)數組聲明必用常量表達式;禁用變量;內存是連續的3)初始化數組元素個數必須<=數組元素個數;沒提供元素系統初始化為0,0.0,\0只需給首元素賦值0剩余元素會自動初始化為 0( int arr[3]{} == int arr[3]={0} )必須顯式指定除第一維之外的全部數組維數;避免幻數-定義常量N只能給元素逐個賦值不能給數組整體賦值 int a[10] = 1;錯誤1.2.定義: array<int, rows>arr 替代:int a[rows]array<array<int, cols>, rows> arr 替代:int a[rows][cols]array<array<array<int, cols>, 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]{}; //所有元素初始化為0int arr[]{2,3,4};//用初始化列表定義數組大小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[]={1,2,3};int a[2][3] = {{1,2,3,4,5,6}; int arr[][]{{0,0},{0,0}} //錯誤int a[][3] = {{1,2,3},{4,5}}; //不足部分用0來填補{ 1,2,3,4,5,0 };int a[][2][3] = { { { 1 }, { 4 } }, { { 7, 8 } } };int a[2][2][3] = { { { 1, 0, 0 }, { 4, 0, 0 } },{ { 7, 8, 0 }, { 0, 0, 0 } } };int a[2][2][3] = { 1, 0, 0, 4, 0, 0, 7, 8 };int a[2][2][3] = { 1,[0][1][0] = 4,[1][0][0] = 7, 8 }; //利用元素指示符int a[2][2][3] = { {1},[0][1] = {4},[1][0] = {7, 8} }; //等價上面int arr[][3][4]{{{11,12,13,14},{21,22,23,24},{31,32,33,34}},{{11,12,13,14},{21,22,23,24},{31,32,33,34}}};
實例1.2:void view_array_2D(){int arr2[3][4]{ 11,12,13,14,21,22,23,24,31,32,33,34 };int* p2 = &arr2[0][0];for (long long i1 = 0; i1 < 3; i1++){for (long long i2 = 0; i2 < 4; i2++){cout << *(p2 + i1*4+i2)<< ",";}//cout << arr2[i1][i2] << ",";等效cout << endl;}} void view_array_3D(){int arr3[2][3][4] {11,12,13,14,21,22,23,24,31,32,33,34,41,42,43,44,51,52,53,54,61,62,63,64};int* p = &arr3[0][0][0];for (long long i1 = 0; i1 < 2; i1++){for (long long i2 = 0; i2 < 3; i2++){for (long long i3 = 0; i3 < 4; i3++){cout << *(p + i1*3*4+i2*4+i3) << ",";}//cout << arr3[i1][i2][i3] << ",";等效 cout << endl;}cout << endl;}}
實例2.1:array替換普通數組constexpr size_t rows{ 3 }, cols{ 4 }, channels{ 2};void view_array_1D(){ //1D數組 array<int, rows>arr{ 1,2 };arr.at(2) = 3;for (auto v : arr)cout << v << ",";cout << endl;//1,2,3,}
void view_array_2D(){ //2D數組 //array<array<int, cols>, rows> arr2{{11,12,13,14,21,22,23,0,31,32,33,34}};等價array<array<int, cols>, rows> arr2{ {{11,12},{21,22,23},{31,32,33,34}} };arr2.at(0).at(2) = 13; arr2[0][3] = 14;for (auto v : arr2){for (auto v1 : v)cout << v1 << ",";cout << endl;}}/*11, 12, 13, 14,21, 22, 23, 0,31, 32, 33, 34,*/
void view_array_3D(){ //3D數組array<array<array<int, cols>, rows>, channels>arr3{ {{{{11,12,13,14},{21,22,23,24},{31,32,33,34}}},//{11,12,13,14,21,22,23,24,31,32,33,34},//等效上面{41,42,43,44,51,52,53,54,61,62,63,64}} };//array<array<array<int, cols>, rows>, channels>arr3{ {11,12,13,14,21,22,23,24,31,32,33,34,41,42,43,44,51,52,53,54,61,62,63,64} };//等效上面arr3.at(0).at(1).at(2)=-1;//channel=0,row=1,col=2arr3[0][1][2] = -1; //等效上面但不做邊界檢查for (auto v : arr3){ //channelsfor (auto v1 : v){ //rowsfor(auto v2:v1){cout << v2 << ",";}//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<stdio.h>#include<stdlib.h>int main(){char a[2][3];memset(a,0,sizeof(a));printf("%Iu\n",sizeof(a));//6for(int i=0;i<2;i++){ for(int j=0;j< 3;j++)printf("%d ",a[i][j]);}return 0;}
3.備注:指針與數組的區別
3.1.指針變量int *p:1)是變量存儲數據是地址;可進行數值運算 2)*,[]運算符可用作數組指針*a=a[0]=*(p+i)=p[0]=23.2.數組變量int a[2]:1)代表數組最首元素地址;不可數值運算2)數組變量是特殊的指針,數組變量本身表達地址p = a= &a[0] ;3)數組變量無需用取址符& ; a[i]==*(a+i);sizeof(a) == sizeof(int *)4)實際上數組是 const 指針不能被賦值 int a[] = {1,2,5,7}; int b[];// int b[]實質上等價于int const *b; b是常數不能被改變,初始化出來代表這個數組就不能再改變 b = a; (錯誤) 數組變量之間不可互相賦值。 int *q = a;是可以 5)&a是數組變量的地址(&a+1)是增大整個數組內存大小地址:增大4*2
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的C++17基本教程 第6讲 数组 (tcy)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 九、CMS
- 下一篇: vue 集成第三方动画库(animate