C笔试------sizeof,strlen

第一个例子

    char* ss = "0123456789";

    sizeof(ss) 结果4 .  ss是指向字符串常量的字符指针,对于一个指针来说,它在内存占用的空间一定是4个字节

    sizeof(*ss) 结果1.  *ss是第一个字符, sizeof对某种类型使用时,返回的是该类型在内存中占用的空间。

    strlen(ss) = 10. Strlen的参数为字符数组,或者是字符指针,返回字符数组中的字符个数,不包括'\0'。

    Strlen(*ss) 是错误的,因为*ss是一个字符,而不是一个字符串指针。

 

    char ss[] = "0123456789";

    sizeof(ss) 结果 11.   ss是数组,计算到\0位置,因此是10+1

    sizeof(*ss) 结果 1 .  *ss是第一个字符

    strlen(ss) = 10. Strlen的参数为字符数组,或者是字符指针,返回字符数组中的字符个数,不包括'\0'。

    Strlen(*ss) 是错误的,因为*ss是一个字符,而不是一个字符串指针。

 

 

    char ss[100] = "0123456789";

    sizeof(ss) 结果是100 .  ss表示在内存中的大小 100×1.s 虽然ss中只存放了11个元素,但是它的静态大小(即一开始定义的,系统分配给它的)为100.

    strlen(ss) 结果是10.   Strlen是一个函数,它不管你的数组是多大的,它返回的是里面存放的元素个数,所以它从头开始找,直到'\0'。

 

    int ss[100] = "0123456789";

    sizeof(ss) 结果 400 .  ss表示再内存中的大小 100×4

    strlen(ss) 错误.       strlen的参数只能是char* 且必须是以''\0''结尾的

 

 第二个例子:

  class X {

        int i;

        int j;

        char k;

  };

  X x;

  class Y{ 

 

  };

  cout<<sizeof(X)<<endl; 结果 12。 由于X中参数字节最长的是int型,它是4字节的,未超过处理器的位数,所以它必须按4字节对齐,也就是说sizeof(X)必须能够整除4.所以最后一个成员k虽然只占了一字节,但是它后面有3字节是空着的。如果超过的处理器的位数,则按处理器的位数进行对齐。 

  cout<<sizeof(x)<<endl;  同上

  sizeof(Y) = 1;

 

 第三个例子:

  char szPath[MAX_PATH]

  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小

[sizeof和strlen的区别]

  (1) sizeof是运算符,strlen是函数。

  (2) sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:short f(); printf("%d\n", sizeof(f()));输出的结果sizeof(short)即2

  (3) 数组做sizeof的参数不退化,传递给strlen就退化为指针了。

  (4) 大部分编译程序 在编译的时候就把sizeof计算过了, 是用于计算类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

  (5) 当使用于一个结构体类型或变量时,sizeof 返回实际的大小,当适用一静态地空间数组,sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

  (6) 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,相当于一个指针,所以strlen的参数可以是字符串指针,也可以是字符数组首地址,但一定需要'\0'作为结尾。

  (7)sizeof计算结构体变量,类的大小时,必须讨论数据对齐问题。

posted on 2014-12-01 14:39  Hugh_Sun  阅读(219)  评论(0)    收藏  举报

导航