您的位置:首页 > 编程语言 > C语言/C++

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

2016-07-09 23:45 399 查看
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'停止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: