天天看點

C語言中 數組的運算及sizeof()和strlen()操作符的簡單介紹

sizeof()

sizeof 在是用來判斷資料類型或者表達式的長度符,(注意:它和strlen不一樣它隻是一個操作符,而strlen()為一個函數)

MSDN上的解釋為:

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.

文法形式:

sizeof(object);//sizeof(對象)

sizeof(type_name);//sizeof(類型)

是以,

int i;

sizeof( i ); // ok

sizeof( int ); // ok

strlen()

strlen() 是計算字元串的實際長度的函數

頭檔案 : string.h

格式 :strlen (字元數組名)

功能 :計算字元串s的(unsigned int型)長度,不包括’\0’在内

說明 :傳回s的長度,不包括結束符NULL

sizeof和strlen的差別

strlen(char*)函數求的是字元串的實際長度,它求得方法是從開始到遇到第一個’\0’,如果你隻定義沒有給它賦初值,這個結果是不定的,它會從aa首位址一直找下去,直到遇到’\0’停止。

而sizeof()傳回的是變量聲明後所占的記憶體數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen是函數。

⒈sizeof操作符的結果類型是size_t,它在頭檔案中typedef為unsigned int類型。

該類型保證能容納實作所建立的最大對象的位元組大小。

⒉sizeof是操作符(關鍵字),strlen是函數。

⒊sizeof可以用類型做參數,strlen隻能用char*做參數,且必須是以”\0”結尾的。

⒋數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。

⒌大部分編譯程式 在編譯的時候就把sizeof計算過了是類型或是變量的長度這就是sizeof(x)可以用來定義數組維數的原因

char str[20]=”0123456789”;

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

6.strlen的結果要在運作的時候才能計算出來,是用來計算字元串的長度,不是類型占記憶體的大小。  

7.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數。

⒏當适用了于一個結構類型時或變量, sizeof 傳回實際的大小,

當适用一靜态地空間數組, sizeof 歸還全部數組的尺寸。

sizeof 操作符不能傳回動态地被分派了的數組或外部的數組的尺寸

⒐數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首位址,

如:

fun(char [8])

fun(char [])

都等價于 fun(char *)

數組的運算

接下來我們用sizeof進行數組運算(//後為運作結果)

需要知道的是隻有這兩種情況數組名才代表整個數組

int arr[5]={0};

1、sizeof直接加數組名sizeof(arr);

2、&數組名 &arr

代碼1:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};(char類型1個位元組大小)

char arr[] = {'a','b','c','d','e','f'};
        printf("%d\n", sizeof(arr));//6 整個數組大小
        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 整個數組之後下一個空間的位址+1是偏移了一個數組的大小即f之後,但它仍是個指針,指針的大小永遠為4
        printf("%d\n", sizeof(&arr[]+));//4 第一個元素的位址
           

代碼2:char arr[] = “abcdef”;

char arr[] = "abcdef";
        printf("%d\n", sizeof(arr));//7 整個字元串大小 多了\0
        printf("%d\n", sizeof(arr+));// 4第一個元素a的位址大小
        printf("%d\n", sizeof(*arr));//1第一個元素大小
        printf("%d\n", sizeof(arr[]));// 1第二個元素大小
        printf("%d\n", sizeof(&arr));// 4整個字元串位址的大小
        printf("%d\n", sizeof(&arr+));// 整個字元串之後下一個空間的位址,+1是偏移了一個字元串的大小即f之後,但它仍是個指針,指針的大小永遠為4
        printf("%d\n", sizeof(&arr[]+));// 4第二個元素b位址的大小
           

代碼3:int a[] = { 1, 2, 3, 4 };(int類型4個位元組大小)

int a[] = { , , ,  };
    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));//16 整個數組大小
    printf("%d\n", sizeof(&a + ));//4 整個數組之後下一個空間的位址+1是偏移了一個數組的大小即4之後,但它仍是個指針,指針的大小永遠為4
    printf("%d\n", sizeof(&a[]));//4 第一個元素位址的大小
    printf("%d\n", sizeof(&a[] + ));//4  第二個元素位址的大小
           

代碼4:char *p = “abcdef”;

char *p = "abcdef";
    printf("%d\n", sizeof(p));//4 整個字元串位址大小
    printf("%d\n", sizeof(p+));//4 第二個元素位址的大小
    printf("%d\n", sizeof(*p));//1 第一個元素a大小
    printf("%d\n", sizeof(p[]));//1第一個元素a大小
    printf("%d\n", sizeof(&p));//4 第一個元素位址的大小
    printf("%d\n", sizeof(&p+));//4 整個字元串之後下一個空間的位址,+1是偏移了一個字元串的大小即f之後,但它仍是個指針,指針的大小永遠為4
    printf("%d\n", sizeof(&p[]+));//4 第二個元素大小
           
接下來我們用strlen進行數組運算(//後為運作結果)

代碼1:char *p = “abcdef”;

char *p = "abcdef";
        printf("%d\n", strlen(p));//6 整個字元串長度 不包括\0
        printf("%d\n", strlen(p+));//5 第二個元素開始字元串長度
        printf("%d\n", strlen(*p));//err *p是一個具體的值 系統崩潰
        printf("%d\n", strlen(p[]));//err 同上
        printf("%d\n", strlen(&p));//x 随機值 p位址(用二級指針來存放p的位址,也就是位址的位址)之後不知何時遇到\0停止
        printf("%d\n", strlen(&p+));//x p位址之後的空間不知何時遇到\0停止
        printf("%d\n", strlen(&p[]+));//5 第二個元素開始字元串長度
           

代碼2:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};

char arr[] = {'a','b','c','d','e','f'};
        printf("%d\n", strlen(arr));//x 随機值 不知何時有\0停止
        printf("%d\n", strlen(arr+));//x 同上
        printf("%d\n", strlen(*arr));//err *arr是一個值 系統崩潰
        printf("%d\n", strlen(arr[]));//err同上
        printf("%d\n", strlen(&arr));//x 
        printf("%d\n", strlen(&arr+));//x 
        printf("%d\n", strlen(&arr[]+));//x 
           

代碼3:char arr[] = “abcdef”;

char arr[] = "abcdef";
        printf("%d\n", strlen(arr));// 6 整個字元串長度不包括\0
        printf("%d\n", strlen(arr+));// 6 整個字元串長的
        printf("%d\n", strlen(*arr));// err 崩潰
        printf("%d\n", strlen(arr[]));//err 崩潰
        printf("%d\n", strlen(&arr));// 6 字元串長度
        printf("%d\n", strlen(&arr+));//x 随機值偏移了整個數組大小 不知何時遇到\0停止
        printf("%d\n", strlen(&arr[]+));// 5 第二個元素開始字元串長度
           

繼續閱讀