文章目錄
- 1 一維數組名
-
- 1.1 一維數組名稱的作用
- 1.2 一維數組名的2種特例情況
- 2 數組指針的定義方式
-
- 2.1 typedef定義數組類型
- 2.2 typedef定義數組指針類型
- 2.3 直接定義數組指針變量
- 3 二維數組名
-
- 3.1 二維數組名的作用
- 3.2 二維數組名的2種特例情況
- 3.3 函數形參接收二維數組名的實參
1 一維數組名
參考本人部落格《C++數組》第2.2節一維數組的數組名。
1.1 一維數組名稱的作用
(1)統計整個數組的長度,例:sizeof(arr) / sizeof(arr[0]);
數組占用記憶體空間大小:數組單個元素占用記憶體空間大小:
sizeof(arr)
數組長度:
sizeof(arr[0])
sizeof(arr) / sizeof(arr[0])
(2)擷取數組在記憶體中的首位址,例:arr。
擷取數組首位址:或
arr
。
&arr[0]
注:或
arr
:數組首元素的位址 ;
&arr[0]
:整個數組的位址【位址值相同,含義不同】。
&arr
1.2 一維數組名的2種特例情況
一維數組名不表示數組首元素位址的兩種特例:
①
sizeof(數組名)
:整個數組的大小;
②
&數組名
:整個數組的位址(位址值與首元素位址相同,但意義不同),表示數組指針。
注:其它情況下,一維數組的數組名均表示數組首元素位址,等價于相應的指針類型。
2 數組指針的定義方式
int arr[] = {1 , 2 , 3 , 4 , 5, 6};
一維數組的數組指針
&arr
(一維數組取位址)的資料類型:
int (*)[6]
2.1 typedef定義數組類型
先定義數組類型,再通過數組類型定義數組指針變量。
typedef int(ARRAY_TYPE)[6];
ARRAY_TYPE *arrP = &arr;
注: ARRAY_TYPE
是存儲6個int元素的數組類型。
2.2 typedef定義數組指針類型
先定義數組指針的類型,再通過數組指針類型定義數組指針變量。
typedef int(*ARRAY_POINTER_TYPE)[6];
ARRAY_POINTER_TYPE arrP = &arr;
2.3 直接定義數組指針變量
int (*arrP)[6] = &arr;
示例:通過數組指針通路數組元素
//*arrP等價于arr
for(int i = 0; i < 5; i++){
printf("%d\n", (*arrP)[i]); //[]的優先級高于*
//printf("%d\n", *((*arrP) + i)); //等價寫法
}
3 二維數組名
3.1 二維數組名的作用
int arr[][3] = {{1,2,3},{4,5,6},[7,8,9]};
二維數組名
arr
相當于指向第1個一維數組的數組指針(一維數組的數組指針),資料類型為
int (*)[3]
。
//定義數組指針(一維數組的數組指針)
int (*pArray)[3] = arr;
//通過數組指針通路二維數組元素
printf("%d\n", arr[1][2]);
printf("%d\n", *(*(arr + 1) + 2));
printf("%d\n", *(*(pArray + 1) + 2));
//二維數組的本質是一維數組
//C語言中,二維數組的記憶體線性排列,按每行元素依次存儲
printf("%d\n", *(*arr + 5));
3.2 二維數組名的2種特例情況
二維數組名不表示第1個一維數組的數組指針(一維數組的數組指針)的兩種特例:
①
sizeof(數組名)
:對二維數組名使用sizeof,表示整個數組的大小;
②
&數組名
:對二維數組名取位址,表示的資料類型為
資料類型:int (*)[3][3]
。
示例:
int arr[][3] = {{1,2,3},{4,5,6},[7,8,9]};
//對二維數組名取位址時,表示的資料類型為int (*)[3][3]
int (*p)[3][3] = &arr;
3.3 函數形參接收二維數組名的實參
(1)
void func(int (*arr)[3], int row, int col)
(2)
void func(int arr[3][3], int row, int col)
(3)
void func(int arr[ ][3], int row, int col)
【不建議】