說說 sizeof

sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是返回一個對象或者類型所佔的內存字節數.
有如下特性:

  • 判斷數據類型或者表達式長度符
  • 不是一個函數
  • 字節數的計算在程序編譯時進行,而不是在程序執行的過程中才計算出來
  • 不能求void類型的長度,但可以求void類型的指針的長度
  • 當表達式作sizeof的操作數時,返回表達式的計算結果的類型大小,不對表達式求值
  • 求得的結構體(及其對象)的大小並不等於各個數據成員的大小之和
  • 不能求動態分配的內存的大小
  • 能求靜態分配內存的數組的長度,不能求不完整數組的大小

sizeof有三種語法形式,如下:

    sizeof(object);         //sizeof(對象);
    sizeof(type_name);      //sizeof(類型);
    sizeofobject;           //sizeof對象;

sizeof的常量性

基本數據類型的sizeof

指針變量的sizeof

數組的sizeof

結構體的sizeof

與strlen區別

  • strlen(char*)函數求的是字符串的實際長度,直到遇到第一個’\0’,然後就返回計數值,且不包括’\0’
  • sizeof()函數返回的是變量聲明後所佔的內存數,不是實際長度
  • sizeof是算符,strlen是函數
  • sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以”\0”結尾的
  • sizeof操作符的結果類型是size_t,該類型保證能容納實現所建立的最大對象的字節大小
  • 數組做sizeof的參數不退化,傳遞給strlen就退化爲指針了
  • 大部分編譯程序在編譯的時候就把sizeof計算成是類型或是變量的長度
  • strlen的結果要在運行的時候才能計算出來,是用來計算字符串的長度,不是類型佔內存的大小
  • sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因爲sizeof是個操作符不是函數
  • 於一個結構類型或變量, sizeof 返回實際的大小,於靜態的空間數組, sizeof 歸還全部數組的大小
  • 數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址

補充:

  • 對char類型或值爲char類型的表達式做sizeof操作結果爲1
  • 對引用類型做sizeof操作將返回存放此引用類型對象所需的內存空間大小
  • 對指針做sizeof操作將返回存放指針所需內存大小;如果要獲取該指針所指向對象的大小,則必須對該指針進行解引用操作
  • 對數組做sizeof操作等效於將其元素類型做sizeof操作的結果乘上數組元素的個數。因爲sizeof返回整個數組中的存儲長度,所以用sizeof數組的結果除以sizeof其元素類型的結果,可以求出數組元素的個數。

用例代碼:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

/*  當sizeof運算符應用到 char 類型的對象時,它將生成1,當應用到數組時,它將產生該數組的字節總數,而非由數組標識符表示的指針的大小.若要獲取由數組標識符表示的指針的大小,將其作爲參數傳遞給使用 sizeof 的函數。 */

int main(){
    printf("----------------sizeof----------------------\n");

    short int sa = 10;
    int a = 10;
    long la = 10;
    float f = 20;
    double d = 20;
    char ch = 'c';

    char str[] = "ABCDEF";  //等價於char str[7];
    char *p = str;

    char *pc = "addbc";
    char **ppc = &pc;   //&pc是地址,*ppc是指向ppc的值的指針,**ppc是指向(*ppc)地址的指針

    int aa[10];
    int *q = aa;
    int *bb[10];

    struct str1{
        double d;
        char ch;
        int data;
     }str_s1;

     struct str2{
        char ch;    
        double d;
        int data;
     }str_s2;

    printf("-------------sizeof(short):     %d\n",sizeof(sa));
    printf("---------------sizeof(int):     %d\n",sizeof(a));
    printf("--------------sizeof(long):     %d\n",sizeof(la));
    printf("--------------izeof(float):     %d\n",sizeof(f));
    printf("------------sizeof(double):     %d\n",sizeof(d));
    printf("-------------sizeof(2+3.4):     %d\n",sizeof(2+3.4));
    printf("--------------sizeof(char):     %d\n",sizeof(ch));
    printf("---ABCDEF---sizeof(string):     %d\n",sizeof(str));
    printf("--int aa[10]---sizeof(int):     %d\n",sizeof(aa));
    printf("--int *bb[10]--sizeof(int):     %d\n",sizeof(*bb));
    printf("\n--------sizeof(char_point):   %d\n",sizeof(*p));
    printf("---------sizeof(int_point):     %d\n",sizeof(*q));
    printf("\n---sizeof(char_point_addr):   %d\n",sizeof(p));
    printf("----sizeof(int_point_addr):     %d\n",sizeof(q));
    printf("--------sizeof(point_addr):     %d\n",sizeof(ppc));
    printf("\n-----------sizeof(Struct1):   %d\n",sizeof(str_s1));
    printf("-----------sizeof(Struct2):     %d\n",sizeof(str_s2));
    printf("\n---sizeof(*ppc_point_addr):   %d\n",sizeof(*ppc));
    printf("-------sizeof(**ppc_point):     %d\n",sizeof(**ppc));

    printf("------------------------------------------------\n");
    getchar();  
    // system("pause");
    return 0;
}

運行結果如下:

結果

@author ace_hjm

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章