1.  sizeof 是算术符;参数可以为变量,类型,函数;求的是类型占内存的大小
    sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
2.  strlen 是函数;参数须为char *,且须以'\0'结尾;求的是字符串的长度;

    sizeof不是函数,而是一种单目操作符,在编译时求值的,而且这个值在程序中被当作一个常量来处理。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

 
  
  1. int fun();  
  2. printf("%d\n",sizeof(fun())); 


可以参考:http://www.vckbase.com/document/viewdoc/?id=1054  
                    http://blog.csdn.net/fareast8612/article/details/6856482

 

总结几个sizeof 求类型大小的试题

 
  
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <windows.h>  
  4.  
  5. typedef union 
  6. {  
  7.     long i;  
  8.     int k[5];  
  9.     char c;  
  10. }DAT;  
  11. struct data  
  12. {  
  13.     int cat;  
  14.     DAT cow;  
  15.     double dog;  
  16. }too;  
  17.  
  18. int main()  
  19. {  
  20.     DAT max;  
  21.     printf("%d %d\n",sizeof(struct data),sizeof(max)); //32 20  

 

 
  
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. int main()  
  4. {  
  5.     char s1[]="";  
  6.     char s2[]="hello world";  
  7.     char *p1=s2;  
  8.     char *p2=NULL;  
  9.     char *p3="hello world";  
  10.   printf("sizeof(s1)=%d\n",sizeof(s1));   //1     
      printf("sizeof(s2)=%d\n",sizeof(s2));   //12     
      printf("sizeof(p1)=%d\n",sizeof(p1));   //4     
      printf("sizeof(&p1)=%d\n",sizeof(&p1)); //4     
  11.   printf("sizeof(p2)=%d\n",sizeof(p2));   //4     
      printf("sizeof(&p2)=%d\n",sizeof(&p2)); //4
     
      printf("sizeof(p3)=%d\n",sizeof(p3));  //4
      printf("sizeof(&p3)=%d\n",sizeof(&p3)); //4
      printf("sizeof(*p3)=%d\n",sizeof(*p3)); //1
  12.  
  13.     return 0;  

 汉字占几个字节

 
  
  1. char str[]="hello中国";  
  2. printf("%d\n",sizeof(str));  //10 
 
  
  1. sizeof("abcdefg");      //8  
  2. sizeof("abcdefg"+'2');  //8  
  3. sizeof("abcdefg"+'2'+'2');  //4  
  4. sizeof("abcdefg"+12);   //8  求字符串大小
  5. sizeof("abcdefg"+12+12);  //4  求指针大小

     "abcdefg"字符串常量开始的时候是不会在内存中分配地址的,只有对它进行需要取地址的操作后才能让字符串常量在内存中占有一定的地址。
    所以第一次的+'2'操作只是让"abcdefg"字符串在内存中分配一定的地址,但sizeof的操作数还是字符串(即此时的操作类似与char p[]= "abcdefg"; sizeof(p);),第二次加'2'才是对数组名加'2'