数组的本质分析
文章目錄
- 1 數組的基本概念
- 1.1 數組的概念
- 1.2 數組的大小
- 2 數組名
- 2.1 數組地址與數組名
- 2.2 數組名的盲點
- 3 a和&a的區別
- 3.1 a和&a的區別
- 4 二維數組
- 4.1 二維數組的概念
- 4.2 二維數組的數組名
1 數組的基本概念
1.1 數組的概念
數組是相同類型的變量的有序集合。
1.2 數組的大小
數組的大小:
- 數組在一片連續的內存空間中存儲元素。
- 數組元素的個數可以顯示或隱式指定。
a[2] = 0, a[3] = 0, a[4] = 0;b中包含了2個元素。
2 數組名
2.1 數組地址與數組名
關于數組地址和數組名:
- 數組名代表數組首元素的地址。
- 數組的地址需要用取地址符號&才能得到。
- 數組首元素的地址值與數組的地址值相同。
- 數組首元素的地址與數組的地址是兩個不同的概念。
2.2 數組名的盲點
數組名必須知道如下幾點:
- 數組名可以看作一個指針常量。
- 數組名“指向”的是內存中數組首元素的起始位置。
- 數組名不包含數組的長度信息。
- 在表達式中數組名只能作為右值使用。
- 只有下列場合中數組名不能看作常量指針。
- 數組名作為sizeof操作符的參數。
- 數組名作為&運算符的參數。
數組名在大多數情況下被當成常量指針處理,但是數組名并不是指針,不能將其等同于指針!
3 a和&a的區別
3.1 a和&a的區別
a和&a的區別如下:
- a為數組首元素的地址。
- &a為整個數組的地址。
- 兩者類型不同。
- a和&a的區別在于指針運算。
示例代碼:
#include <stdio.h>int main() {int a[5] = {1, 2, 3, 4, 5};int* p1 = (int*)(&a + 1); int* p2 = (int*)((int)a + 1);int* p3 = (int*)(a + 1);printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);return 0; }// p1[-1]輸出5,p2[0]輸出33554432, p3[1]輸出3(小端系統)4 二維數組
4.1 二維數組的概念
二維數組的基本概念:
- 二維數組在內存中以一維的方式排布。
- 二維數組的第一維是一維數組。
- 二維數組中的第二維才是具體的值。
- 二維數組的數組名可看作常量指針。
注意:內存中并不存在a[0]、a[1]、a[2]這一維。
二維數組的遍歷:
#include <stdio.h> #include <malloc.h>void printArray(int a[], int size) {int i = 0;printf("printArray: %d\n", sizeof(a));for(i=0; i<size; i++){printf("%d\n", a[i]);} }int main() {int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};int* p = &a[0][0];int i = 0;int j = 0;for(i=0; i<3; i++){for(j=0; j<3; j++){printf("%d, ", *(*(a+i) + j));}printf("\n");}printf("\n");printArray(p, 9);return 0; }4.2 二維數組的數組名
一維數組名代表數組首元素的地址:
- int a[5],a的類型為int*。
二維數組名同樣代表數組首元素的地址: - int m[2][5],m的類型為int(*)[5]。
結論:
動態申請二維數組:
#include <stdio.h> #include <malloc.h>int** malloc2d(int row, int col) {int** ret = NULL;if( (row > 0) && (col > 0) ){int* p = NULL;ret = (int**)malloc(row * sizeof(int*));p = (int*)malloc(row * col * sizeof(int));if( (ret != NULL) && (p != NULL) ){int i = 0;for(i=0; i<row; i++){ret[i] = p + i * col;}}else{free(ret);free(p);ret = NULL;}}return ret; }void free2d(int** p) {if( *p != NULL ){free(*p);}free(p); }int main() {int** a = malloc2d(3, 3);int i = 0;int j = 0;for(i=0; i<3; i++){for(j=0; j<3; j++){printf("%d, ", a[i][j]);}printf("\n");}free2d(a);return 0; }參考資料:
總結
- 上一篇: 常用的数字逻辑电路符号
- 下一篇: 控制显卡