數組在記憶體中是連續存儲的。由低位址到高位址。
為了很好的管理記憶體,我們對記憶體進行了一個詳細的編址。
結論:1.記憶體中的每一個記憶體單元(位元組)對應一個位址。
2.在32位平台上指針的大小是4個位元組,64位平台上是8個位元組。
指針可以了解為一個變量,是一個專門用來存放位址的一個變量。
1.數組的數組名其實是數組首元素的位址。
2.數組名+整數的運算,其實可以擷取到數組每個元素的位址。例如:arr+2;
3.二維數組在記憶體總的存儲:二維數組在記憶體中也是連續存儲的。
&arr[0][1] = arr[0]+1; &arr[1][1] = arr[1]+1;
&arr[0]+1 = &arr[1][0]; &arr[1]+1 = &arr[2][0];
&arr[0] = &arr[0][0]; &arr[1] = &arr[1][0];
數組的記憶體配置設定形式
char arr[] = "abc"; //‘a’'b' 'c' '\0'
char arr2[] = {'a','b','c'}; //‘a’'b' 'c'
char* p = "abcdef"; //p中存放a的位址。
有關數組的運算:
**總結:sizeof(數組名),這裡的數組名表示整個數組。
&數組名,這裡的數組名表示整個數組。**
**(1)sizeof():傳回值為unsigned int,該類型能保證能容納實作所建立的最大對象的位元組大小。其值在編譯時就已計算好,參數可以是數組,指針,對象,函數等。由于在編譯時計算,不能傳回動态配置設定的記憶體空間大小。函數時傳回類型所占空間的大小,傳回類型不能是void。此操作符傳回這個指針占的空間,一般是4個位元組,而對于數組,傳回這個數組所有元素占的總空間。
(2)strlen():運作時才計算,參數必須是字元型指針(char*),當數組名作為參數傳入時,實際上數組就退化成指針了。strlen()函數的傳回值類型為size_t (無符号整形),是以不能以他的傳回值比較運算。不區分是指針還是數組,讀到\0為止就傳回,而且strlen不把\0計算在内**。
一維數組
int a[] = {,,,};
printf("%p\n",&a); //數組首位址
printf("%p\n",&a+); //跳過整個數組的大小
printf("%p\n",&a[]); //第一個元素的位址
printf("%p\n",&a[]+);//第二個元素的位址
printf("%p\n",a+); //第二個元素的位址
printf("%d\n",sizeof(a)); //16
printf("%d\n",sizeof(a+));//4 首元素位址。
printf("%d\n",sizeof(*a));//4
printf("%d\n",sizeof(a+));//4 指向數組的第二個元素的位址
printf("%d\n",sizeof(a[]));//4
printf("%d\n",sizeof(&a));//4
printf("%d\n",sizeof(&a+));//4 數組位址加一跳過整個數組
printf("%d\n",sizeof(&a[]));//4
printf("%d\n",sizeof(&a[]+));//4
字元數組
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6 sizeof(數組名)表示整個數組的大小
printf("%d\n", sizeof(arr+));//4 位址
printf("%d\n", sizeof(*arr));//1 第一個元素
printf("%d\n", sizeof(arr[]));//1 第一個元素
printf("%d\n", sizeof(&arr));//4 數組位址
printf("%d\n", sizeof(&arr+));//4 跳過整個數組的位址
printf("%d\n", sizeof(&arr[]+));//4第二個元素的位址
printf("%d\n", strlen(arr));//x19 随機數
printf("%d\n", strlen(arr+));//x19 随機數
printf("%d\n", strlen(*arr));//error 不可以傳一個值,必須是一個指針
printf("%d\n", strlen(arr[]));//error
printf("%d\n", strlen(&arr));//x19
printf("%d\n", strlen(&arr+));//x-6 13
printf("%d\n", strlen(&arr[]+));//x-1 18
字元數組
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 char*與char[]是不一樣在sizeof中
printf("%d\n", sizeof(arr+));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr+));//4
printf("%d\n", sizeof(&arr[]+));//4
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr+));//6
printf("%d\n", strlen(*arr));//error
printf("%d\n", strlen(arr[]));//error
printf("%d\n", strlen(&arr));// 6
printf("%d\n", strlen(&arr+));//x 12 跳過整個數組,以\0計算結束
printf("%d\n", strlen(&arr[]+));//5 從第二個字元開始計算
char* p = "abcdef";
printf("%d\n", sizeof(p));//4 sizeof裡傳指針,是4個位元組大小
printf("%d\n", sizeof(p+));//4
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[]));//1
printf("%d\n", sizeof(&p));//4
printf("%d\n", sizeof(&p+));//4
printf("%d\n", sizeof(&p[]+));//4
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+));//5
printf("%d\n", strlen(*p));//error
printf("%d\n", strlen(p[]));//error
printf("%d\n", strlen(&p));//x 從指針的位址尋找, 随機位址查找
printf("%d\n", strlen(&p+));//x*2
printf("%d\n", strlen(&p[]+));//5
二維數組
int a[][] = {};
printf("%p\n",a);
printf("%p\n",a[][]);
printf("%p\n",a[]);//第一行的首位址
printf("%p\n",a[]+); //第一行第二個元素位址
printf("%p\n",a+); //第二行首位址
printf("%d\n",sizeof(a));//48
printf("%d\n",sizeof(a[][]));//4
printf("%d\n",sizeof(a[]));//16 第一行的大小,
printf("%d\n",sizeof(a[]+));//4 第一行第二個
printf("%d\n",sizeof(a+));//4 第二行首位址
printf("%d\n",sizeof(&a[]+));//4
printf("%d\n",sizeof(*a));//16 *&a =48, 數組首元素位址,也就是一維數組的第一個位址
printf("%d\n",sizeof(a[]));//16 //編譯器就以确定,不做運算。