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