2017-12-19 创建人:Ruo_Xiao
邮箱:xclsoftware@163.com
2018-01-16 修改人:Ruo_Xiao
增加strlen的头文件的说明。
#include "stdafx.h"
#include "iostream"
using namespace std;
int add(int i,int t)
{
return (i+t);
}
int _tmain(int argc, _TCHAR* argv[])
{
int iData1[5];
double dData2[7];
int *pData = new int[3];
char *p1 = "12345";
char *p2 = new char[3];
char p3[] ="Hello World";
p2[0] = '1';
p2[1] = '2';
p2[2] = '3';
p2[3] = '3';
p2[4] = '4';
memset(iData1,0,sizeof(int)*5);
memset(dData2,0,sizeof(double)*7);
//cout<<"sizeof(add) = "<<sizeof(add)<<endl; 报错,故不能是函数名。
cout<<"sizeof(iData1) = "<<sizeof(iData1)<<endl;
cout<<"sizeof(dData2) = "<<sizeof(dData2)<<endl;
cout<<"sizeof(pData2) = "<<sizeof(pData)<<endl;
cout<<"sizeof(double) = "<<sizeof(double)<<endl<<endl;
cout<<"sizeof(p1) = "<<sizeof(p1)<<endl;
cout<<"sizeof(*p1) = "<<sizeof(*p1)<<endl<<endl;
cout<<"sizeof(p3) = "<<sizeof(p3)<<endl;
cout<<"strlen(p3) = "<<strlen(p3)<<endl<<endl;
cout<<"strlen(p1) = "<<strlen(p1)<<endl;
cout<<"strlen(p2) = "<<strlen(p2)<<endl;
cin.get();
return 0;
}
运行结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCgWyZSQ-1657088983230)(https://img-blog.youkuaiyun.com/20171219183041010?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXR3b3JsZDEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
一、sizeof
-
“sizeof”是操作符。
-
返回值的类型是size_t,它在头文件中定义如下:
typedef unsigned int size_t;
-
返回值意义是保证能容纳实现所建立的最大对象的字节大小。
-
参数可以是数组、指针、类型、对象等。
-
编译时执行。
-
由上述例子的运行结果可知:
(1)当形参是一个结构类型或变量时, sizeof 返回实际的大小。
(2)当形参是一个静态地址空间时, sizeof 归还全部数组的所占的字节数。
(3)不能返回动态地被分派了的数组或外部的数组的所占的字节数。
因为该变量里面的内容是某一块内存的首地址,不是连续的,故只能返回指针所占的字节数。
(4)有的小伙伴说可以使用“sizeof(函数名)”,在这里更正一下,由代码可知,这么做是错误的。The sizeof operator shall not be applied to an expression that has function type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member.
翻译:sizeof不能用于函数类型和不完整的类型、这些类型带括号的或者成员也不行。
二、strlen ()##
- size_t strlen(const char * _Str);
- 该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’。
- 由上述例子中可以发现,由于"p1"由字符串赋值(后面自带“\0”),所以可以得到p1的字符串长度为5。而“p2”是由字符单个赋值,并且后面的“\0”不知道在什么地方,所以该字符串长度为错误值“16”。
- 运行时执行。
- 头文件:
#include <string.h>
三、延伸##
- 数组名和指针不同,当数组名作为函数形参时会退化为同类型的指针,这也是为什么传递数组名时会传递数组长度的原因。
- 单引号的表示一个字符,比如说字母a,在程序中以’a’表示。
双引号围起来的是一个字符串,后面有一个’\0’,这是例子中为什么“sizeof(p3)”比“strlen(p3)”大一的原因。 - 源码工程。
http://download.youkuaiyun.com/download/itworld123/10164900