strlen和sizeof区别
求字符串长度
字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。
常见的获取字符串长度的方法包括如下几种。
1.使用sizeof获取字符串长度sizeof的含义很明确,它用以获取字符数组的字节数(当然包括结束符0)。
对于ANSI字符串和UNICODE字符串,形式如下:1.sizeof(cs)/sizeof(char)2.sizeof(ws)/sizeof(wchar_t)可以采用类似的方式,获取到其字符的数目。
如果遇到MBCS,如"中文ABC",很显然,这种办法就无法奏效了,因为sizeof()并不知道哪个char是半个字符。
2.使用strlen()获取字符串长度strlen()及wcslen()是标准C++定义的函数,它们分别获取ASCII字符串及宽字符串的长度,如:1.size_t strlen( const char *string );2.size_t wcslen( const wchar_t *string );strlen()与wcslen()采取0作为字符串的结束符,并返回不包括0在内的字符数目。
3.使用CString::GetLength()获取字符串长度CStringT继承于CSimpleStringT类,该类具有函数:1.int GetLength( ) const throw( );GetLength()返回字符而非字节的数目。
比如:CStringW中,"中文ABC"的GetLength()会返回5,而非10。
那么对于MBCS呢?同样,它也只能将一个字节当做一个字符,CStringA表示的"中文ABC"的GetLength()则会返回7。
4.使用std::string::size()获取字符串长度basic_string同样具有获取大小的函数:1.size_type length( ) const;2.size_type size( ) const;length()和size()的功能完全一样,它们仅仅返回字符而非字节的个数。
strlen和sizeof的区别
strlen和sizeof的区别strlen 是⼀个库函数,计算传进来的字符串的长度,以 ‘\0’结尾sizeof 是⼀个运算符,它计算的是传进来的指针在内存中所占空间⼤⼩,在编译时就已经获得了结果。
C语⾔中没有字符串,⽤的是字符数组来模拟字符串。
C风格的字符串时字符数组然后在末尾加0表⽰结尾。
//在C语⾔中有strlen和sizeof两个函数求字符数组的长度函数,他们俩的区别就是是否把最后的结束标志也加上去。
//错误//strlen是不加的,他表⽰字符串的长度。
//错误⽽sizeof求的是字符串在内存中的长度,所以它是加上最后的'\0'的//所以⼀般⽽⾔后者的长度会⽐前者多1。
//错误#include<stdio.h>#include<string.h>int main(){char buf[] = "abcd";printf("sizeof(buf) = %d\n",sizeof(buf));printf("strlen(buf) = %d\n",strlen(buf));return1;}运⾏结果:exbot@ubuntu:~/shareWin/CAndC++$ ./sizeofandstrlensizeof(buf) = 5strlen(buf) = 4它们相差 1 并不是 sizeof 和 strlen 的问题,⽽是 buf 没有指定空间⼤⼩,直接初始化后需要多少空间在后⾯+1,所以表现出来的效果显⽰成sizeof结果⽐strlen⼤1strlen计算的是字符串到'\0'位置的⼤⼩sizeof计算的字符串占的内存⼤⼩#include<stdio.h>#include<string.h>int main(){char str[100] = {0};strcpy(str, "abcd");int str_len = strlen(str);int str_size = sizeof(str);printf("strlen(str) = %d\n", (str_len));printf("sizeof(str) = %d\n", (str_size));return0;}运⾏结果:ubuntu@ubuntu:~/workspace/test$ gcc sizeofAndStrlen.c -o sizeofAndStrlenubuntu@ubuntu:~/workspace/test$ ./sizeofAndStrlenstrlen(str) = 4sizeof(str) = 100。
字符串的sizeof长度及strlen长度
字符串的sizeof长度及strlen长度在C/C++中,字符串是以零('\0')结尾的。
⽐如,对于下⾯的字符串:"hello"在最后⼀个字符'd'后⾯,还有⼀个我们⾁眼看不见的'\0'字符,作为该字符串的结束符。
所以,"Hello"其在内存中的存储形式为:'H' 'e' 'l' 'l' 'o' '\0'最后有⼀个我们看不见的'\0'。
明⽩了字符串的结尾⽅式,那么如何计算字符串的长度呢?⽐如:例题1:char str1[]="12345678";char str2[]={'1','2','3','4','5','6','7','8'};char str3[]={'1','2','3','\0','5','6','7','8'};sizeof(str1)=?sizeof(str2)=?sizeof(str3)=?strlen(str1)=?strlen(str2)=?strlen(str3)=?分析:str1是⼀个字符数组,由字符串"12345678"进⾏初始化。
由于"12345678"含有⼀个结尾字符'\0',所以str1数组共有9个字符。
因此sizeof(str1)=9。
str2也是⼀个字符数组,它的长度由'1','2','3','4','5','6','7','8'8个字符初始化,并没有指明零字符。
sizeof与strlen的区别
strlen函数与sizeof的区别,C语言strlen与sizeof 的区别详解strlen 是一个函数,它用来计算指定字符串str 的长度,但不包括结束字符(即null 字符)。
其原型如下面的代码所示:size_t strlen(char const* str);也正因为strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:1.char sArr[]="ILOVEC";2./*用strlen()求长度*/3.printf("sArr的长度=%d\n",strlen(sArr));很显然,上面示例代码的运行结果为6(因为不包括结束字符null)。
这里需要特别注意的是,函数strlen 返回的是一个类型为size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:1./*判断一*/2.if(strlen(x)>=strlen(y))3.{4.}5./*判断二*/6.if(strlen(x)-strlen(y)>=0)7.{8.}从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。
其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?原因很简单,因为函数strlen 的返回结果是size_t 类型(即无符号整型),而size_t 类型绝不可能是负的。
因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。
同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:1./*判断一*/2.if(strlen(x)>=5)3.{4.}5./*判断二*/6.if(strlen(x)-5>=0)7.{8.}很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
C++获取字符串长度的几个函数方式
C++获取字符串长度的⼏个函数⽅式C/C++ strlen(str)、str.length()、str.size()、sizeof(str)都可以求字符串长度。
其中str.length()、str.size()、sizeof(str)是⽤于求string类对象的成员函数strlen(str)是⽤于求字符数组的长度,其参数是char*。
补充知识:获取字符串长度的函数sizeof()、strlen()、length()、size()详解和区别在C++中计算长度的函数有四种,它们分别是sizeof() ,size(),strlen(),str.length()。
⼀. sizeof()和strlen()两者区别:1)sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
2)sizeof是运算符,strlen是函数。
3)sizeof可以⽤类型做参数,strlen只能⽤char*做参数,且必须是以''\0''结尾的。
4)sizeof在编译时期就计算出来,strlen在运⾏之后才能计算出来。
5)strlen计算字符串的具体长度(只能是字符串),不包括字符串结束符。
返回的是字符个数。
sizeof计算声明后所占的内存数(字节⼤⼩),不是实际长度。
举例:1)char* ss = "0123456789";sizeof(ss)为4,ss是指向字符串常量的字符指针,sizeof 获得的是指针所占的空间,则为4sizeof(*ss)为1,*ss是第⼀个char字符,则为12)char ss[] = "0123456789";sizeof(ss)为11,ss是数组,计算到'\0'位置,因此是(10+1)sizeof(*ss)为1,*ss是第⼀个字符3)char ss[100] = "0123456789";sizeof(ss)为100,ss表⽰在内存中预分配的⼤⼩,100*1strlen(ss)为10,它的内部实现⽤⼀个循环计算字符串的长度,直到'\0'为⽌。
Sizeof与Strlen的区别与联系
Sizeof与Strlen的区别与联系1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是运算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序在编译的时候就把sizeof计算过了,看它是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。
char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果接类型参数必须加括弧,如果是变量名可以不加括弧。
这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量,sizeof 返回实际的大小,当适用一静态地址空间数组,sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。
9.数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如:fun(char [8])fun(char [])都等价于 fun(char *)在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。
如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度。
C++基础面真题
1.const符号常量:〔1〕、const char Xp〔2〕、char const Xp〔3〕、char X const p如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
2.析构函数和虚函数的用法和作用?析构函数的作用是当对象生命期结束时释放对象所占用的资源。
析构函数用法:析构函数是特别的类成员函数它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。
只是在类对象生命期结束时有系统自动调用。
虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联遍。
3.堆和栈的区别栈〔stack〕:由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方法类似于数据结构中的栈。
堆:一般由程序员分配释放,假设不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分成分法类似。
4.头文件的作用是什么?1.通过头文件来调用库功能。
在很多场合,源代码不便〔或不准〕向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么完成的。
编译器会从库中提取出相应的代码。
2.头文件能加强类型平安检查。
如果某个接口被完成或被使用时,其方法与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
5.内存的分成分法有几种?1.从静态存储地域分配。
内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。
如全局变量。
2.在栈上创立。
在执行函数时,函数内局部变量的存储单元都可以在栈上创立,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。
3.从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
中创面试题
1、自我介绍
2、学校学的知识
3、C++学得怎么样
4、Sizeof()和strlen()的区别(实例)
5、C++的三大特征
6、bool,int,float,指针和零的比较
7、堆栈区别及分配区间顺序
8、数据结构里面的几种算法:比如:快排
9、数据库的知识:SQL和Qracle,Qracle里面常用的关键字的用法
10、指针和引用的区别、两者的安全性问题
11、项目中,能不能群发消息
12、一个10字节的字符数组,其中存放了5个字符串,用sizeof和strlen测得的结果是多少
13、int *p、int **p、int ***p的区别
14、if define的用处
15、指针有多大
16、数组越界,会不会报错
17、全局变量和局部变量能否同名
18、项目描述,及自己负责模块的实现
19、static的用法
20、c链表的创建、输出、删除、插入
21、冒泡排序
22、c++何时调用构造函数
23、c++运算符重载
24、c语言的结构体和c++的类有什么区别
25、数据库中的增删差改语句
26、c语言和c++有什么不同
27、链表的分类
28、浮点型所占字节
29、初始化单链表,插入结点
30、socket编程相关知识
31、tcp/ip协议的认识,怎样判断一个服务器是基于tcp的
32、MFC的掌握,其框架的认识
33、API函数
34、多态的实现,实现多态是通过什么方式的
35、进程、线程的理解
36、消息机制的概念
37、对内存管理的理解
38、对静态指针的理解。
c语言获取字符串长度的函数
c语言获取字符串长度的函数摘要:1.函数strlen()2.函数sizeof()3.自定义函数计算字符串长度正文:在C 语言中,获取字符串长度的函数有以下几种:1.函数strlen()strlen() 函数是C 语言标准库中的一个函数,用于计算字符串的长度。
它接受一个字符指针作为参数,并返回字符串中字符的个数,不包括字符串结束符"0"。
使用strlen() 函数时,需要包含头文件<string.h>。
例如,假设有一个字符串"hello, world!",我们可以通过以下代码计算其长度:```c#include <stdio.h>#include <string.h>int main() {char str[] = "hello, world!";int length = strlen(str);printf("字符串长度为:%d", length);return 0;}```2.函数sizeof()sizeof() 函数是C 语言中的一个运算符,用于计算数据类型或变量在内存中占用的字节数。
我们可以使用sizeof() 函数来计算字符串的长度,但这种方法只适用于字符数组,而不适用于字符指针。
例如,我们可以通过以下代码计算字符串"hello, world!"的长度:```c#include <stdio.h>int main() {char str[] = "hello, world!";int length = sizeof(str) / sizeof(str[0]);printf("字符串长度为:%d", length);return 0;}```这里,我们首先计算字符数组str 在内存中占用的字节数,然后除以字符数组中每个字符的字节数(在C 语言中,字符占用一个字节),得到字符串的长度。
第3章 数组(习题答案及解析)
习题3 参考答案一、选择题3.1 C 分析:本题考查程序和数组的基本概念。
3.2 A 分析:字符串比较大小是以第1个不相同字符的大小为标准的,跟长度没有关系,B选项不正确;字符串比较大小除了使用库函数strcn3()以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小。
因为字符串在表达式中相当于const char*,即常字符指针,代表的是字符串的首地址,关系运算符会将两个字符串的首地址值比较大小,这是毫无意义的。
C选项不正确。
C语言中只有字符串常量而没有字符串变量,D选项描述不正确;空串的长度为0,而以空格打头的字符串的长度至少为1,因此A选项是正确。
3.3 A 分析:如果第一维的长度没有指定,则定义的同时需要完成初始化,否则不知道分配多大的内存空间给它,所以选项B、C错误;二维数组a[2][3]中只有两个元素,都是一维数组,一维下标最大只能是a[1],所以选项D错误;若完成初始化的二维数组,第一维的长度没有指定,则第一维的大小按如下规则确定:若初值个数能被第二维大小整除,所得的商就是第一维的大小,若不能整除,则所得的商加1作为第一维的大小,所以选项A相当于:double a[1][3] = {6};其中a[0][0]=6,其他元素赋值0,选项A正确,答案为A。
3.4 D 分析:本题考察的知识点是:字符串常量。
在C语言中,字符串常量是以双引号括起来的字符序列。
因此B选项和C选项不正确。
字符序列中可包含一些转义字符,转义字符都是以"\"开头的。
A选项中包含了三个"\",前两个(\\)代表了一个"\"字符,后面一个和"""一起(\")被看作一个""",所以该字符串缺少一个结束的""",因此不正确。
D选项的两个"""之间没有任何字符,代表的是一个空串,是合法的字符串常量,因此D选项正确。
常见的VC获取字符串长度的方法
常见的VC获取字符串长度的方法字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。
常见的获取字符串长度的方法包括如下几种。
后面有源码和最终效果图1.使用sizeof获取字符串长度sizeof的含义很明确,它用以获取字符数组的字节数(当然包括结束符0)。
对于ANSI字符串和UNICODE字符串,形式如下:sizeof(cs)/sizeof(char) sizeof(ws)/sizeof(wchar_t) 可以采用类似的方式,获取到其字符的数目。
如果遇到MBCS,如"中文ABC",很显然,这种办法就无法奏效了,因为sizeof()并不知道哪个char是半个字符。
2.使用strlen()获取字符串长度strlen()及wcslen()是标准C++定义的函数,它们分别获取ASCII字符串及宽字符串的长度,如:size_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); strlen()与wcslen()采取0作为字符串的结束符,并返回不包括0在内的字符数目。
3.使用CString::GetLength()获取字符串长度CStringT继承于CSimpleStringT类,该类具有函数:int GetLength( ) const throw( ); GetLength()返回字符而非字节的数目。
比如:CStringW中,"中文ABC"的GetLength()会返回5,而非10。
那么对于MBCS呢?同样,它也只能将一个字节当做一个字符,CStringA表示的"中文ABC"的GetLength()则会返回7。
4.使用std::string::size()获取字符串长度basic_string同样具有获取大小的函数:size_type length( ) const; size_type size( ) const; length()和size()的功能完全一样,它们仅仅返回字符而非字节的个数。
C++经典面试题(2012年校园招聘)
1、在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?答案:C语言不支持函数重载,C++ 提供了C连接交换制定符号extern "C"解决名字匹配问题。
2、如何判断一段程序是由C编译程序还是由C++编译程序编译的?答案:C++编译时定义了_cplusplus。
C编译时定义了_STDC_。
3、main主函数执行完毕后,是否可能会再执行一段代码?给出说明。
答案:如果需要加入一段在main退出后执行的代码,可以使用atexit()函数注册一个函数,代码为:int atexit(void (*funciton)(void));4、用预处理指令#define声明一个常数,用以表明一年中有多少秒(忽略闰年问题)。
答案:#define SECONDS_PER_YEAR (60*60*24*365)UL 注意括号,同时不能用分号,不要写出计算出来的实际值,用到无符号长整型。
5、const与#define有什么区别?答案:两者都可以定义常量。
1)const常量有数据类型,而宏常量没有数据类型。
编译器可以对前者进行安全检查,而对后者只进行字符替换,没有类型安全检查;2)有些集成化调试工具可以对const进行调试,不能对宏常量进行调试。
const在C中其实是值不能修改的变量,因此会给它分配存储空间(默认是外部连接的),在C++中对于基本数据类型的常量,编译器会把它放到符号表里而不是分配存储空间(默认是内部连接的,若强制声明为extern,则需要分配存储空间)。
const int bufsize = 100; //在C++中注意此处int一定不可少,因为c++中不支持默认int型char buf[bufsize]; //在C++中这样写没问题const bufsize;//在C中这样写没问题,但是在C++中是有错误的。
//要做同样的事情,C++需改强制声明为extern:extern const bufsize;6、写一个标准宏MIN,输入两个参数返回最小值。
C语言经典面试题目及答案详解(三)
C语言经典面试题目及答案详解(三)接着更新C语言面试题,希望能帮助到大家!1、变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。
一个变量可以在多个地方声明,但是只在一个地方定义。
加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。
2、写出 bool 、int、 float、指针变量与“零值”比较的if 语句bool 型数据: if( flag ) {A; } else {B; } int 型数据: if( 0 != flag ) {A; } else {B; }指针型数: if( NULL == flag ) {A; } else {B; } float 型数据: if ( ( flag >= NORM ) && ( flag <= NORM ) ) {A; }注意:应特别注意在 int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“==”误写成“=”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。
3、sizeof 和 strlen 的区别sizeof 和 strlen 有以下区别:1. sizeof 是一个操作符,strlen 是库函数。
2. sizeof 的参数可以是数据的类型,也可以是变量,而strlen 只能以结尾为‘\0‘的字符串作参数。
3. 编译器在编译时就计算出了 sizeof 的结果。
而 strlen 函数必须在运行时才能计算出来。
并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
4. 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。
2019CC++《阿里》面试题总结
2019CC++《阿⾥》⾯试题总结⼀、C和C++的区别是什么?C是⾯向过程的语⾔,C++是在C语⾔的基础上开发的⼀种⾯向对象编程语⾔,应⽤⼴泛。
C中函数不能进⾏重载,C++函数可以重载C++在C的基础上增添类,C是⼀个结构化语⾔,它的重点在于算法和数据结构。
C程序的设计⾸要考虑的是如何通过⼀个过程,对输⼊(或环境条件)进⾏运算处理得到输出(或实现过程(事务)控制),⽽对于C++,⾸要考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
C++中struct和class除了默认访问权限外,别的功能⼏乎都相同。
⼆、关键字static、const、extern作⽤static和const的作⽤在描述时主要从类内和类外两个⽅⾯去讲:static关键字的作⽤:(1)函数体内static变量的作⽤范围为该函数体,该变量的内存只被分配⼀次,因此其值在下次调⽤时仍维持上次的值;(2)在模块内的static全局变量和函数可以被模块内的函数访问,但不能被模块外其它函数访问;(3)在类中的static成员变量属于整个类所拥有,对类的所有对象只有⼀份拷贝;(4)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因⽽只能访问类的static成员变量。
const关键字的作⽤:(1)阻⽌⼀个变量被改变(2)声明常量指针和指针常量(3)const修饰形参,表明它是⼀个输⼊参数,在函数内部不能改变其值(4)对于类的成员函数,若指定其为const类型,则表明其是⼀个常函数,不能修改类的成员变量(const成员⼀般在成员初始化列表处初始化)(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为”左值”。
extern关键字的作⽤:(1)extern可以置于变量或者函数前,以标⽰变量或者函数的定义在别的⽂件中,提⽰编译器遇到此变量和函数时在其他模块中寻找其定义。
sizeof 用法(非常全面)
4. 基本数据类型的sizeof
这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。
c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。最后得到sizeof(S3)的值为16。
sizeof( 2 ); // 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,我们来看一个完整的例子:
c语言中判断数据类型长度符的关键字
用法
sizeof(类型说明符,数组名或表达式);
或
sizeof 变量名
1. 定义:
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
MSDN上的解释为:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
sizeof用法
sizeof()sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。
它在编译时起作用,而不是运行时。
这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。
让我们先看一个结构体:struct S1{char c;int i;};问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int 占4个字节,那么加起来就应该是5。
是这样吗你在你机器上试过了吗也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。
Why为什么受伤的总是我请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:S1 s1 = { 'a', 0xFFFFFFFF };定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下:0012FF78: 61 CC CC CC FF FF FF FF发现了什么怎么中间夹杂了3个字节的CC看看MSDN上的说明:When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。
为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。
为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被 4整除的地址上,以此类推。
C++面试常见问题
C++⾯试常见问题指针和引⽤的区别指针是⼀个变量,存储的是⼀个地址,引⽤跟原来的变量实质上是同⼀个东西,是原变量的别名指针可以有多级,引⽤只有⼀级指针可以为空,引⽤不能为NULL且在定义时必须初始化指针在初始化后可以改变指向,⽽引⽤在初始化之后不可再改变sizeof指针得到的是本指针的⼤⼩,sizeof引⽤得到的是引⽤所指向变量的⼤⼩当把指针作为参数进⾏传递时,也是将实参的⼀个拷贝传递给形参,两者指向的地址相同,但不是同⼀个变量,在函数中改变这个变量的指向不影响实参,⽽引⽤却可以。
引⽤只是别名,不占⽤具体存储空间,只有声明没有定义;指针是具体变量,需要占⽤存储空间。
引⽤在声明时必须初始化为另⼀变量,⼀旦出现必须为typename refname &varname形式;指针声明和定义可以分开,可以先只声明指针变量⽽不初始化,等⽤到时再指向具体变量。
引⽤⼀旦初始化之后就不可以再改变(变量可以被引⽤为多次,但引⽤只能作为⼀个变量引⽤);指针变量可以重新指向别的变量。
不存在指向空值的引⽤,必须有具体实体;但是存在指向空值的指针。
堆和栈的区别申请⽅式不同:栈由系统⾃动分配;堆是⾃⼰申请和释放的。
申请⼤⼩限制不同:栈顶和栈底是之前预设好的,栈是向栈底扩展,⼤⼩固定,可以通过ulimit -a查看,由ulimit -s修改;堆向⾼地址扩展,是不连续的内存区域,⼤⼩可以灵活调整。
申请效率不同:栈由系统分配,速度快,不会有碎⽚;堆由程序员分配,速度慢,且会有碎⽚。
区别以下指针类型int *p[10]int (*p)[10]int *p(int)int (*p)(int)int *p[10]表⽰指针数组,强调数组概念,是⼀个数组变量,数组⼤⼩为10,数组内每个元素都是指向int类型的指针变量。
int (*p)[10]表⽰数组指针,强调是指针,只有⼀个变量,是指针类型,不过指向的是⼀个int类型的数组,这个数组⼤⼩是10。
sizeof和strlen的区别
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
sizeof和 strlen的ቤተ መጻሕፍቲ ባይዱ别
一、指代不同 1、sizeof:用于获取字符串的长度,是处理字符串的重要工具。 2、strlen:所作的是一个计数器的来工作。 二、规则不同 1、sizeof:可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,不需要用圆括号自。 2、strlen:从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结知束符'\0'为止,然后返回计数器值。 三、用法不同 1、sizeof:sizeof( type_name ); // sizeof( 类型 );编译时起作用道,而不是运行时。 2、strlen:extern unsigned int strlen(char *s);返回s的长度,不包括结束符NULL。
sizeof()函数用法汇总
sizeof()函数用法汇总1. 与strlen()比较strlen计算字符数组的字符数,以“\0"为结束符,不计算“\0"为数组元素。
sizeof()计算数据(数组、变量、类型、结构体等)所占空间,用字节数表示。
2.指针与静态数组的sizeof操作指针均可看为变量类型的一种,所有指针变量的sizeof操作结果均为4 。
(这个已实践证明)所以不要用下面的方式去计算一个字符数组的长度:char *a= "nihaomao";int count = sizeof(a);//返回值为4而应该使用下面的方式计算:char a[] = "nihaomao";int count = sizeof(a);返回值为1*8=8int a[10];sizeof(a)则返回值为4*10=40 。
PS:数组做形参时,数组名称被当做指针使用。
例如:(已验证)void fun(char p[]) {sizeof(p); //返回值为4}经典问题:double* (*a)[3][6];cout<<sizeof(a)<<endl; // 4 a为指针cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。
既然是指针,所以sizeof(a)就是4。
既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
}
sizeof是内置运算符,返回变量的地址占用字节数。a被编译器看作是一个1024字节的数组,所以返回1024。
(3)换成指针,输出4
#include <iostream.h>
int main()
{
char *a="12345rwtrwgr5t4333";
cout<<sizeof(a)<<endl;
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
return 0;
}
a被编译器看作是一个指向数组的指针。而指针在32位编译器中占用4个字节,所以返回4。
Sizeof与Strlen的区别与联系(转)
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
out<<strlen(a)<<endl;
return 0;
}
strlen是函数,是用来返回字符串长度的,而C字符串要求以'\0'为结束符。你的char a[1024]="12345rwtrwgr5t4333";就没有包含结束符。strlen函数执行的时候一直没发现'\0',结果地址越界了,所以就出错。
型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
请教一下strlen和sizeof
(1)出错
#include <iostream.h>
int main()
{
char a[1024]="12345rwtrwgr5t4333";
char a[1024]="12345rwtrwgr5t4333\0";就对了。
(2)输出1024
#include <iostream.h>
int main()
{
char a[1024]="12345rwtrwgr5t4333";
cout<<sizeof(a)<<endl;
return 0;