天天看點

簡記關鍵字sizeof

sizeof 是計算配置設定記憶體的大小,是C語言中保留關鍵字,也可以認為是一種運算符,單目運算符。但是最好不要把sizeof當成函數,也不要看作一進制操作符,把他當成一個特殊的編譯預處理。

1.sizeof用法

sizeof(typename)//sizeof(類型)
sizeof objict//sizeof對象
           
int main()
{
   printf("------------------------sizeof object-------------------------\n");
   int a=0;
   double a1=1.2;
   printf("sizeof a = %d\n",sizeof a);
   printf("sizeof a1 = %d\n",sizeof a1);
   printf("------------------------sizeof(typename)-------------------------\n");
   printf("sizeof int = %d\n",sizeof(int) );
   printf("sizeof short int = %d\n",sizeof(short int));
   printf("sizeof long long = %d\n",sizeof(long long));
   printf("sizeof double = %d\n",sizeof(double));
   printf("sizeof float = %d\n",sizeof(float));
   printf("sizeof char = %d\n",sizeof(char));
}
           
簡記關鍵字sizeof

2.關于與strlen的差別

  strlen執行的計數器的工作它從記憶體的某個位置開始掃描,直到碰到第一個字元串結束符’\0’為止,然後傳回計數器值,求的是字元串的實際長度。

   sizeof是關鍵字,它以位元組的形式給出了其操作數的存儲大小,求的是占用記憶體的大小,操作數可以是一個表達式或類型名,操作數的存儲大小由操作數的類型決定。

(sizeof統計'\0',strlen不統計'\0')

3.關于指針

int main()
{
   printf("------------------------指針-------------------------\n");
   printf("sizeof int = %d\n",sizeof(int*) );
   printf("sizeof short int = %d\n",sizeof(short int*));
   printf("sizeof long long = %d\n",sizeof(long long*));
   printf("sizeof double = %d\n",sizeof(double*));
   printf("sizeof float = %d\n",sizeof(float*));
   printf("sizeof char = %d\n",sizeof(char*));
   printf("sizeof char = %d\n",sizeof(void*));
   //sizeof不能求得void類型的長度,但sizeof不能求得void類型指針的長度。
}
           
簡記關鍵字sizeof

指針也是變量,隻不過它是存放其他變量的位址的變量。指針的本質就是整形,指針又叫無符号的整形,是以,可以說指針的sizeof都為4。即在32位系統是4,在64系統是8 。

4.關于數組

int main()
{
   printf("------------------------數組-------------------------\n");
   int s[2];
   double s1[4];
   //int b[];
   printf("sizeof a = %d\n",sizeof(s) );
   // printf("sizeof b = %d\n",sizeof(b) );
  //sizeof不能對具有未知存儲大小的資料類型求值
   printf("sizeof c = %d\n",sizeof(s1) );
}
           

數組s1,s2的大小在定義時未指定,編譯時給它配置設定的空間是按照初始化的值确定的,s3是多元數組,占用的空間大小是各維數的乘積,也就是36。可以看出,數組的大小就是他在編譯時被配置設定的空間,也就是各維數的乘積*數組元素的大小。

特别需要注意的是(1)a是動态數組,但是它實質上還是一個指針,是以sizeof(d)的值是4。

int main()
{
    printf("------------------------數組-------------------------\n");
    int *a = new int[10];
    int s[2]= {1,2};
    char s1[]="sdeef";
    int s2[]= {1,2,3,4};
    int s3[3][3]= {{1,2},{3,4}};
    cout<<"*a="<<sizeof(*a)<<endl;
    cout<<"s="<<sizeof(s)<<endl;
    cout<<"s1="<<sizeof(s1)<<endl;
    cout<<"s2="<<sizeof(s2)<<endl;
    cout<<"s3="<<sizeof(s3)<<endl;
}
           
簡記關鍵字sizeof

 (2)可以用sizeof求數組長度,如int a[10];  sizeof(a)/sizeof(a[0])或 sizeof(a)/sizeof(int)可以擷取數組的長度 .

 (3)數組作為形式參數傳遞給函數時,傳遞的是指針而不是數組,傳遞的為數組的首位址。如fun(char[8])和fun(char[])都等價于fun(char*)。

int fun(int arr[])
{
    int sum= 0;
    for(int i=0;i<(sizeof(arr)/sizeof(int));i++)//sizeof(arr)等于4
    {
    sum=sum+arr[i];
    }
    return sum;
}
int main()
{
    printf("------------------------數組-------------------------\n");
    int a[10]= {1,2,3,4,5,6,7,8,9,10};
    int sumadd=0;
    for(int i=0;i<(sizeof(a)/sizeof(int));i++)
    {
    sumadd=sumadd+a[i];
    }
    cout<<"sumadd="<<sumadd<<endl;
    cout<<"fun(a)="<<fun(a)<<endl;
}
           
簡記關鍵字sizeof

5.關于結構體

對齊使得結構體大小的計算變得複雜,并非簡單地等于各個成員的大小之和。

int main()
{
    printf("------------------------結構體-------------------------\n");
    struct A
    {
        int am;
        double bm;
        char cm;
    };
    struct B
    {
        int an;
        char cn;
        double bn;
    };
    printf("sizeof A = %d\n",sizeof(A) );
    printf("sizeof B = %d\n",sizeof(B));
}
           
簡記關鍵字sizeof

對于結構體大小的計算規則:

          結構體的大小等于結構體内最大成員大小的整數倍。 結構體内的成員的首位址相對于結構體首位址的偏移量是其類型大小的整數倍,如int型成員相對于結構體的首位址的位址偏移量應該是4的倍數。為了滿足1和2會在結構體成員之後進行位元組填充。

         如對結構體A,根據成員變量出現的順序和對齊方式,先為第一個成員am配置設定空間,其起始位址跟結構的起始位址相同,該成員變量占用4位元組。接下來為第二個成員bm配置設定空間,這時下一個可以配置設定的位址對于結構的起始位址的偏移量為4,該成員變量占用8位元組,不是其倍數,填充三個位元組,為bm配置設定的起始位址的偏移量為8。然後為第三個成員cn配置設定空間,下一個可以配置設定的位址對于結構的起始位址的偏移量為16,cm占用一個位元組,17不是8的倍數,填充7個位元組,結構體A的大小是24。

         對結構體B,根據成員變量出現的順序和對齊方式,先為第一個成員an配置設定空間,其起始位址跟結構的起始位址相同,該成員變量占用4位元組。接下來為第二個成員bm配置設定空間,這時下一個可以配置設定的位址對于結構的起始位址的偏移量為4,該成員變量占用1位元組,是其倍數,為bm配置設定的起始位址的偏移量為5。然後為第三個成員cn配置設定空間,下一個可以配置設定的位址對于結構的起始位址的偏移量為6,cm占用8個位元組,不是8的倍數,填充2個位元組,結構體B的大小是16。

int main()
{
    printf("------------------------結構體-------------------------\n");
    struct C
    {
    };
    printf("sizeof C = %d\n",sizeof(C) );
}
           

注意:空結構體大小為1。

簡記關鍵字sizeof

6.關于函數

sizeof可以對函數調用求大小,并且求得的大小等于傳回類型的大小,并不執行函數體。

int fun(int a)
{
    int sum=0;
    for(int i=0; i<a; i++)
        sum+=i;
    printf("sum = %d",sum);
    return 0;
}
int main()
{
    printf("------------------------結構體-------------------------\n");
    int number=5;
    printf("sizeof fun= %d\n",sizeof(fun(number)));
}
           
簡記關鍵字sizeof

如果有錯誤,歡迎大家指正。

繼續閱讀