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

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标准规定,函数、不能确定类型的表达式以及位域成员不能被计算s izeof值。
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'停止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值