1. sizeof

1.1 sizeof是一个独立的运算符,不是函数。sizeof给我们提供有关数据项目所分配的内存的大小。例如:

1
2
cout << sizeof(long) << endl;   // 输出: 4
cout << sizeof(double) << endl; // 输出:8

1.2 如果将sizeof应用于一个类型,必须要像上面所示那样使用括号。但如果对一个变量使用它,可以不用括号。

1
2
int x;
cout << sizeof x << endl;       // 输出: 4

1.3 char类型表示单个字符,只占一个字节的内存空间,所以sizeof(char)=sizeof(‘a’)=1 。另外,相关数据项目为空,所以sizeof(‘’)不为零,而是报错。但是,“”为一个C风格的字符串,末尾会被自动加上结束符‘\n’,所以有sizeof(“”)=1,sizeof(“\0”)=2。

1
2
3
4
5
6
char c = 'c';
cout << sizeof(char) << endl;   // 输出:1
cout << sizeof(c) << endl;      // 输出:1
//cout << sizeof('') << endl;   // 编译时错误:不能为空字符常量
cout << sizeof("") << endl;     // 输出:1
cout << sizeof("\0") << endl;   // 输出:2

1.4 str1是一个指针,只是指向了字符串"hello"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节。*str与str[0]一样,都表示字符串中的第一个字符‘h’,所以sizeof(*str1)=1。*(str1+1)表示第二个字符,依次类推。

1
2
3
4
const char* str1 = "hello";
cout << sizeof(str1) << endl;   // 输出:4
cout << sizeof(char*) << endl;  // 输出:4
cout << sizeof(*str1) << endl;  // 输出:1

1.5 str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"hello" 占的总空间。"hello"中,共有h e l l o \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6 。

1
2
char str2[]="hello";
cout << sizeof(str2) << endl;   // 输出:6

1.6 str3已经定义成了长度是8的数组,所以sizeof(str3)=8*sizeof(char)=8 。

1
2
char str3[8]={'h',};
cout << sizeof(str3) << endl;   // 输出:8

1.7 如果给出的数据项目不是字符型数组,而是一种自定义类型对像数组,那么sizeof(str3)=8*sizeof(对像类型或对像)。如:

1
2
3
4
5
6
7
8
class A
{
    int x;
    double d;
};
A a[10];
cout << sizeof(A) << endl;      // 输出:16,此处有内存补齐,所以不是12
cout << sizeof(a) << endl;      // 输出:160

1.8 大部分编译程序在编译的时候就把sizeof计算过了,这就是sizeof(x)可以用来定义数组长度的原因。下面数组a2的长度是根据a1的长度来定的。

1
2
3
4
int a1[10];
cout << sizeof(a1)/sizeof(int) << endl;     // 输出:10
int a2[sizeof(a1)/sizeof(int)];
cout << sizeof(a2)/sizeof(int) << endl;     // 输出:10

1.9 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸,特别是当sizeof应用于虚参形式的数组时,得到的结果是4(指针大小) 。应牢记住数组在作为参数传递时,永远都是传递数组的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define MAXSIZE 100
 
// 此处等同于 void PrintSize(char* str)
void PrintSize(char str[MAXSIZE])
{
    cout << sizeof(str) << endl;        // 输出:4
}
 
int main()
{
    char str1[MAXSIZE];
    cout << sizeof(str1) << endl;       // 输出:100
    PrintSize(str1);
}

2.0 sizeof还可以应用于函数,注意函数fun只声明未定义:

1
2
3
4
5
6
7
double fun();
 
int main()
{
    cout << sizeof(fun()) << endl;      // 输出:8
    //cout << sizeof(fun) << endl;      // 编译时出错:非法的sizeof操作数
}

2.1 sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等

1
2
//cout << sizeof(void) << endl;     // 编译时出错:非法的sizeof操作数
cout << sizeof(void*) << endl;      // 输出:4,就是指针的存储空间

总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清。sizeof可应用于任何内置类型和自定义类型。

2. strlen

2.1 strlen是函数,它不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把/0计入字符串的长度的。使用时需要包函头文件string.h。

1
2
3
4
5
6
7
char str4[] = "hello";
cout << strlen(str4) << endl;   // 输出: 5
const char *str5 = "hello";
cout << strlen(str5) << endl;   // 输出:5
 
cout << strlen("") << endl;     // 输出:0
cout << strlen("\0") << endl;   // 输出:0

2.2 strlen只能用于C类型字符串,注意必须是字符串且以‘\0’结尾,用于其它任何类型都是错误的。

1
2
3
4
5
6
7
8
9
10
11
12
13
//cout << strlen(int) << endl;  // 出错:不能用于类型
//cout << strlen('') << endl;   // 出错:不能用于字符
//cout << strlen('a') << endl;  // 出错:不能用于字符
char str6[5] = {'h', 'e', 'l', 'l', 'o'};
//cout << strlen(str6) << endl; // 运行时出错:str6不是一个"C风格字符串",即不是以'\0'
                                    // 结尾的字符串,此处输出一个不确定值,本例为19
class B
{
    int x;
    double d;
};
B b[10];
//cout << strlen(b) << endl;    // 出错:一句话,只能用于字符串,还必须是“C风格的”

2.3 strlen的结果要在运行的时候才能计算出来。

sizeof 和 strlen的更多相关文章

  1. sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

    写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...

  2. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  3. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

  4. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  5. sizeof()和strlen()

    sizeof计算的是栈中大小 P { margin-bottom: 0.21cm; direction: ltr; color: rgb(0, 0, 0); text-align: justify } ...

  6. sizeof 和 strlen 的区别

    sizeof 和 strlen 都是c/c++ 中常见的符号,他们的功能是判断数组长度.那么他么到底有什么区别 1.sizeof    不是函数,而是一个操作符.字节数的计算在程序编译时进行,而不是在 ...

  7. C++-sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  8. sizeof 和 strlen 区别

    Sizeof与Strlen的区别与联系 一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型. ...

  9. sizeof()与strlen()的区别

    首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点: 1.sizeof是一个关键字,而strlen确实一个函数. 2.sizeof求的是字节长度,而 ...

  10. sizeof和strlen小结

    sizeof和strlen小结 写在前面 之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处, ...

随机推荐

  1. xutils的HttpUtils,Post和Get基本使用,以及BitmapUtils的简单使用

    开篇报错注意:本教程是基于xUtils-2.6.14.jar版本实现的 由于studio中6.0以后安卓取消了httpclient,而xutils则基于httpclient开发的,所以现在无法使用,将 ...

  2. Eclipse闪退解决办法

    解决方式: 1.通过在命令行中输入“where java”,找到除jdk目录下的所有java相关程序,直接删掉(一般会在C:\WINDOWS\system32下) 2.内存不足,打开Eclipse目录 ...

  3. 1207.1——C语言 函数

    函数可以分为无参函数和有参函数. 无参函数的定义 无参函数定义的一般形式如下:返回值类型  函数名(){    函数体} 说明: 返回值类型可以是C语言中的任意数据类型. 函数名是标识符的一种,命名规 ...

  4. 1207--ATM自动取款机的实现

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //提示用户操作 void alert(ch ...

  5. Intellij Idea 创建Web项目入门(一)转

    Intellij Idea 创建Web项目入门(一) 相关软件: Intellij Idea14:http://pan.baidu.com/s/1nu16VyD JDK7:http://pan.bai ...

  6. HTML5_1

    2014,新年伊始,我不再是那个憧憬离开大学校园.过自由生活的傻丫头了.23岁,时间荏苒,差不多四分之一的人生已悄然逝去,大学生活差不多也快要画上句号了.工作.工作永远都是人生的一部分.曾想着随便找一 ...

  7. discuz论坛目录功能详解

    在某处收集来的discuz目录资料,二次开发挺有用的.记录下.(基于7.0的标准程序,部分与插件无关的文件不作说明) 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几 ...

  8. 使用fragment,Pad手机共用一套代码

    项目代码结构: 1:MainActivity.java package com.example.fgtest; import android.app.Activity; import android. ...

  9. UFI命令格式里SCSI指令

    有三种字长命令:6位.10位.12位,一般Windows下用12位. 在UFI 命令格式里SCSI指令用到如下: 指令代码 指令名称 说明 04h Format Unit 格式化存储单元 12h In ...

  10. DM365视频处理流程/DM368 NAND Flash启动揭秘

    出自http://blog.csdn.net/maopig/article/details/7029930 DM365的视频处理涉及到三个相关处理器,分别是视频采集芯片.ARM处理器和视频图像协处理器 ...