C语言笔记:变量字节长度&取值范围——sizeof()VS strlen

来源:互联网 发布:酒店清洗床单 知乎 编辑:程序博客网 时间:2024/04/27 15:22

sizeof():是运算符(operator),其作用就是返回一个对象或者类型所占的内存字节数。可用于任何变量名类型名常量,当用于变量名(不是数组名)常量时,它不需要用圆括号。C规定sizeof返回size_t类型的值,是一个无符号整数类型,是根据标准类型定义的,与可移植类型(如int32_t)相同。在头文件stddef.h中定义,一般定义为typedef unsigned int size_t;

因此,语法格式 sizeof 有三种语法形式:

  1) 用于数据类型
sizeof( type_name ); // sizeof( 类型 );
例:
sizeof(int);   //求类型int的sizeof值
2) 用于变量
sizeof ( object ); // sizeof( 对象 );
例:
int a;  //定义一个int类型的变量a
sizeof(a);  //求a的sizeof值
3)用于常数值
sizeof object; // sizeof 对象;
例:
sizeof 6;   //求6的sizeof值
sizeof计算对象的大小也就是转换成对对象类型的计算,因此同种类型的不同对象其sizeof值都是一致的。sizeof也可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,而不是对表达式进行计算。
如:
1.sizeof( 6 ); // 常数6的类型为int,所以等价于 sizeof( int );
sizeof(8);// 常数6的类型为int,所以等价于 sizeof( int );
所以上面两个sizeof的值相等
2.sizeof( 4 + 13.14 ); // 4 + 13.14为17.14,17.14的类型为double,所以等价于 sizeof( double );
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
例如:
int add(){    int a;    int b;    return a   + b;}int main(){    size_t m = sizeof(add());     //m的值为函数add()的sizeof值    printf("%d\n",m);    return 0;}
       3.基本数据类型的sizeof
下为求各种基本数据类型的sizeof值:
#include <stdio.h>    int main(){    printf("sizeof (char) = %d\n",sizeof (char));    printf("sizeof (int) = %d\n",sizeof (int));    printf("sizeof (short) = %d\n",sizeof (short));    printf("sizeof (long) = %d\n",sizeof (long));    printf("sizeof (float) = %d\n",sizeof (float));    printf("sizeof (double) = %d\n",sizeof (double));    printf("sizeof (long long) = %d\n",sizeof (long long));    return 0;}
调试结果:
sizeof (char) = 1    sizeof (int) = 4    sizeof (short) = 2    sizeof (long) = 4    sizeof (float) = 4    sizeof (double) = 8    sizeof (long long) = 8
4.指针变量的sizeof
32位操作系统中任何指针的sizeof值为4字节,因为指针是用来存放地址的,即为计算机内部地址总线的宽度,32位操作系统为4字节,64位的操作系统中指针变量的sizeof值为8.
下面为求指针sizeof值的程序:
#include <stdio.h>    #include <string.h>    int main()   {    char *ptr = "Welcome to China!";    char *str = "See you tomorrow.";    char *p = "Good night.";    printf("sizeof (*ptr) = %d\n",sizeof (ptr));    printf("sizeof (*str) = %d\n",sizeof (str));    printf("sizeof (*p) = %d\n",sizeof (str));    return 0;   }
调试结果:
sizeof (*ptr) = 4    sizeof (*str) = 4    sizeof (*p) = 4
       5.数组的sizeof值
数组的sizeof值等于数组所占用的内存字节数
下面为求数组sizeof值的程序:
#include <stdio.h>    int main(){    int a[100] = {0};    char b[100] = "Hello world!";    printf("sizeof (a) = %d\n",sizeof(a));    printf("sizeof (b) = %d\n",sizeof(b));    return 0;}
调试结果:
sizeof (a) = 400    sizeof (b) = 100
       注意:两个数组的sizeof值不同是因为,数组类型不同,int的sizeof值为4,char的sizeof值为1.
6.结构体的sizeof值
通过下列程序理解一下:
#include <stdio.h>    int main(){    struct stu    {         int age;         char sex;    }STU;    struct class    {        char grade;        int stu_num;    }CLASS;    printf("sizeof (STU) = %d\n",sizeof (STU));    printf("sizeof (CLASS) = %d\n",sizeof (CLASS));    return 0;}

调试结果:
sizeof (STU) = 8    sizeof (CLASS) = 8
       比较一下程序中的两个结构体变量,一个是int,char的顺序,一个是char,int的顺序,两个结构体的sizeof值却一样等于8。原来,结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
7.联合体的sizeof

例题为:
       
#include <stdio.h>   int main(){    union stu    {        int age;        char sex;    }a;    printf("sizeof (a) = %d\n",sizeof(a));    return 0;}
调试结果为:
sizeof (a) = 4
         如果联合体中只有char型,那它的结果为1,如果只有int型,结果则为4.所以整个联合体的sizeof也就是每个成员sizeof的最大值。
注意:联合体和结构体的sizeof值的求法之所以不同,是因为结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以。结构体的成员也可以是复合类型,这里复合类型成员是被作为整体考虑的。
注:1.sizeof只在编译时起作用,而不是运行时。
        2.C99标准规定,函数、不能确定类型的表达式以及位域成员不能被计算sizeof值。
3.为了防止将sizeof误认为一个函数,在写程序的时候,sizeof和()间留一个空格,可以提醒自己sizeof是运算符。
strlen:是函数,其作用是计算给定字符串的长度,计算时,从内存的某一个位置开始扫描,直到扫描到结束符'\0'为止’’。返回值是它所计算的字符长度值,不包括'\0'.一般要包括string.h文件,格式为:unsigned int strlen (char *s);。
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
例题:
#include <stdio.h>    #include <string.h>int main(){    char str[100] = "Hello world!";    printf("the lenght of str[100] = %d\n",strlen(str));    return 0;}
调试结果为:
the lenght of str[100] = 12
注:strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。

0 0
原创粉丝点击