天天看點

sizeof和strlen在數組中的計算

數組在記憶體中是連續存儲的。由低位址到高位址。

為了很好的管理記憶體,我們對記憶體進行了一個詳細的編址。

結論: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  //編譯器就以确定,不做運算。
           

繼續閱讀