C语言中sizeof与strlen区别
C语言关键字详解
C语⾔关键字详解</h1> 相对于其他语⾔来说,C语⾔的关键字算是少的了。
在C98中关键⼦总共只有32个,我们来分析⼀下每个关键字在C语⾔中它独特的作⽤。
1、关于数据类型的关键字 (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 enum类型可以增加可读性,可移植性;在enum中定义的每个对象,默认都是从0开始,当然也可以⾃定义。
如下:enum Color{RED,BLACK,WHITE};enum Number{ONE=1,TWO,THREE}; Color中RED=0,BLACK=1,WHITE=2; Number中ONE=1,TWO=2,THREE=3; (4) float:声明浮点型变量或函数 (5) int:声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 结构体struct的作⽤已经在上⼀篇博⽂中讲到,可以⽤来实现C语⾔的封装,继承,多态等等。
union类型可以⽤来提⾼内存的使⽤率,如下:int main(){union Unoin{int a;float b;char *c;};union Unoin p;p.a = 100;/*执⾏语句1*/p.b = 10.0;/*执⾏语句2*/p.c = "hello world!";/*执⾏语句3*/<span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">} 如果不使⽤union,我们需要分别定义int,float,cahr*,需要占⽤12字节的内存空间,但是当我们使⽤union时,只需要占⽤4字节即可;但是需要注意的时,我们在上⾯那个代码中执⾏语句2或者3中需要⽤到int a时,就⽆法使⽤union 了,必须单独定义int a;否则读出的a值将会错误的。
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个字符初始化,并没有指明零字符。
C语言字符串替换:字符,字符串,字符数组详解
C语⾔字符串替换:字符,字符串,字符数组详解⽬录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)⽤字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,字符数组与字符指针总结案例描述字符串替换是处理字符串时最常见的操作之⼀,也是学习字符串必须掌握的知识。
本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。
案例分析我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为⽌。
为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。
必备知识1,字符数组字符数组是存放字符数据的数组,其中每⼀个元素都是单个字符(1)字符数组的定义字符数组定义的语法格式如下:char 数组名[常量表达式];char 数组名[常量表达式1][常量表达式2]在上述语法中,分别列举了定义⼀维字符数组和⼆维字符数组的⽅法。
⽰例代码如下:char ch[6];(2)字符数组的初始化在数组定义的同时也可以对数组中的元素进⾏赋值,这个过程称为数组的初始化,⽰例代码如下:char c[5] = {'h','e','l','l','o'};注意字符数组的初始化很简单,但要注意以下⼏点。
(1)元素个数不能多于字符数组的⼤⼩,否则编译器会出错(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')(3)如果没有指定数组⼤⼩,则编译器会根据初始项的个数为数组分配长度(4)也可以初始化⼆维数组(和整型数组基本⼀致)2,字符串概念(1)字符串的概念字符串是由数字、字母、下划线和空格等各种字符组成的⼀串字符,是个常量,字符串的末尾都默认有⼀个'\0'作为结束符。
"abcde"" "上⾯这两⾏都是字符串,只不过第⼆个字符串中的字符都是空格字符串在各种编程语⾔中都是⾮常重要的数据类型,但是C语⾔中没有字符串的固定类型,通常⽤字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。
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.}很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
strlen和sizeof的题目
任务名称:strlen和sizeof的区别及用法详解一、背景介绍在编程过程中,我们常常会涉及到字符串的长度计算以及数据类型的大小计算,这时就会用到两个关键字:strlen和sizeof。
虽然这两个关键字都与计算长度有关,但它们使用的场景和计算方式却略有不同,本文将对它们的区别进行详细讨论。
二、strlen关键字2.1 strlen的定义及作用strlen是一个C语言标准库函数,其函数原型为size_t strlen(const char *s)。
它的作用是计算字符串的长度,即字符串中字符的个数。
2.2 strlen的使用方法使用strlen函数需要引用头文件<string.h>。
它的参数是一个指向字符串的指针,返回值是一个无符号整型数。
下面是一个使用strlen函数的简单示例:#include <stdio.h>#include <string.h>int main() {char str[] = "Hello World";size_t len = strlen(str);printf("字符串的长度为:%zu\n", len);return 0;}2.3 strlen的注意事项•传入的参数必须是以null结尾的字符串,即字符串的最后一个字符必须是null字符\0。
•字符串长度不包括null字符本身。
•如果传入的参数是一个空指针,则strlen函数的行为是未定义的。
•如果传入的参数不是以null结尾的字符串,strlen函数可能会访问到非法内存,导致程序崩溃或产生不确定的结果。
三、sizeof关键字3.1 sizeof的定义及作用sizeof是一个操作符,可以计算数据类型或变量的大小,即所占用的字节数。
它返回一个size_t类型的值,表示数据类型或变量所占用的字节数。
3.2 sizeof的使用方法sizeof操作符的参数可以是数据类型、变量或表达式。
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 的时候,通常是计算字符串数组的长度。
第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选项正确。
C语言字符串长度(转)
C语⾔字符串长度(转)C语⾔字符串长度的计算是编程时常⽤到的,也是求职时必考的⼀项。
C语⾔本⾝不限制字符串的长度,因⽽程序必须扫描完整个字符串后才能确定字符串的长度。
在程序⾥,⼀般会⽤strlen()函数或sizeof来获取⼀个字符串的长度,但这2种⽅法获取的字符串的长度其实是不⼀样,我们⽤如下函数进⾏测试:1 #include<stdlib.h>2 #include<string.h>3 #include<stdio.h>4int main() {56char s1[20] = "hello world";7char s2[20] = {'h','e','l','l','0','','w','o','r','l','d','\0'};8char s3[] = "hello\0 world";9char s4[] = {'h','e','l','l','0','\0','','w','o','r','l','d','\0'};1011 printf("%d\t%d\t%d\t%d\n",strlen(s1),strlen(s2),strlen(s3),strlen(s4));12 printf("%d\t%d\t%d\t%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4));13 }注意,该函数⾥⾯定义了4个字符串,基本数据都是“hello world",但需要注意的是,字符串s1和s2给定了字符串数组的⼤⼩为20,然后使⽤2种⽅式进⾏赋值;字符串s3和s4是s1和s2对⽐的字符串,区别就是s3和s4字符串中间插⼊了⼀个'\0'。
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可以置于变量或者函数前,以标⽰变量或者函数的定义在别的⽂件中,提⽰编译器遇到此变量和函数时在其他模块中寻找其定义。
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()函数用法汇总
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。
strlen与sizeof的区别
strlen与sizeof的区别
解析C/C++语⾔中的strlen与sizeof的区别
1.从功能定义上,strlen函数,⽤来求字符串的长度,sizeof函数是⽤来求指定变量或变量类型等所占⽤内存的⼤⼩;
2.sizeof是运算符,⽽strlen是C库函数strlen只能⽤char*做参数,且以'/0'结尾的;
对于静态数组处理:
char str[20]="0123456789";
strlen(str)=10; //表⽰数组中字符串的长度
sizeof(str)=20; //表⽰数组变量分配的长度
对于指针处理:
char *str="0123456789";
strlen(str)=10; //表⽰字符串的长度
sizeof(str)=4; //表⽰指针变量的所占内存⼤⼩
sizeof(*str)=1; //表⽰'0'这个字符变量的所占内存⼤⼩
具体⽽⾔,当参数分别是如下时,sizeof返回的值表⽰的含义如下:
数组----编译时分配的数组空间的⼤⼩;
指针----存储该指针所⽤的空间的⼤⼩(存储该指针的地址的长度,是长整型,应该是4);
类型----该类型所占的空间的⼤⼩;
对象----对象的实际占⽤空间⼤⼩;
函数----函数的返回类型所占的空间⼤⼩。
函数的返回类型不能是void。
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。
辨析C语言中的strlen和sizeof函数
辨析C语言中的strlen和sizeof摘要:strlen函数和sizeof运算符是C语言中两个比较相像的知识点,运用起来容易混淆,文章首先从二者的定义来区分,其次是通过字符串和字符数组的长度来比较二者的不同,最后是通过strlen函数和sizeof运算符所跟内容来辨析它们的不同。
关键词:C语言;strlen函数;sizeof运算符strlen函数和sizeof运算符是C语言中比较重要的知识点,目前各种权威期刊就strlen和sizeof还没有一篇做详细辨析的文章。
各种相关教材上也只是浅显的从一个例子入手,分别介绍和解释说明,网络的情况也与此类似,一问一答的交互方式更显露出知识的零散。
比较法普遍适用于易混的知识点,运用它能够对知识点的认识和理解更全面深刻。
就此,本文运用比较法从以下三个角度全面深入辨析二者。
一、strlen函数和sizeof运算符各自的定义strlen是STRing LENgth (字符串长度)的缩写。
它是测试字符串长度的函数,函数的值为字符串中的实际长度(不包括‟\0‟在内)[1]。
sizeof是求所占内存字节数的一个单目运算符,它求得的值不受存储内容的影响[2]。
例如有以下程序#include<stdio.h>main(){ char s[]=”012xy\08s34f4w2”;printf(“%d ,%d\n”,strlen(s),sizeof(s));}这题的运行结果为5,15解析:字符数组s中的字符为‟0‟,‟1‟,‟2‟,‟x‟,‟y‟,‟\0‟,‟8‟,‟s‟,‟3‟,‟4‟,‟f‟,‟4‟,‟w‟,‟2‟,‟\0‟,strlen统计的是第一个‟\0‟前的字符个数,所以strlen(s)的值为5,而sizeof统计的是字符数组s所占的内存空间,每个字符占一个字节内存空间,共15个字符,所以sizeof(s)的值为15。
如果把上题改成下面这样的,输出结果就完全不同。
字符数组(用sizeof和strlen计算长度的说明)
字符数组(⽤sizeof和strlen计算长度的说明)strlen(char[]):计算⼀个字符数组中\0之前的所有字符数量sizeof(char[]):计算字符数组实际占⽤空间长度当我们执⾏以下代码⽚段时char arr[] = "abc";char arr2[] = {'a','b','c'};printf("%s\n", arr);printf("%s\n", arr2);输出结果为:abc abc烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫虜恄U?当我们在visual studio中跟踪时,会发现arr在字符串最后⾯添加了⼀个'\0',也就是说arr数组的实际长度⽐字⾯长度多了⼀个字节的长度,⽽arr2还是数组的实际长度3。
当我们修改上述代码,在arr2末尾增加⼀个0char arr[] = "abc";char arr2[] = {'a','b','c',0};printf("%s\n", arr);printf("%s\n", arr2);此时运⾏后,结果相同。
由此可以推断,'\0'和0相等,都代表字符串的结束标志,当定义字符串数组时,实际上系统是在字符串字⾯量末尾增加了⼀个'\0',也就是int类型的0。
字符串常量系统会⾃动在结尾增加⼀个字符\0,该结论通过以下语句就更容易理解了printf("%s",sizeof("hello"));输出结果为:6当输出不带0的arr2时,当系统没遇见0时,也就是说没遇见字符串结束标志时,系统就是⼀直打印它后⾯的字符,直到遇见0字符位置为⽌第⼀种情况char arr[3];//定义⼀个数组,并开辟了3个字符空间,但是没有初始化。
c语言的数组长度问题
c语⾔的数组长度问题c语⾔中定义⼀个数组,如何获取数组的长度有时是我们必须所⽤到的。
引出sizeof和strlen!1.sizeof与strlen()⽐较strlen计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,⽤字节数表⽰(当然⽤在字符数组计算"\0"的⼤⼩)。
举例:{int a[5]={1,3,5,7,9};int i=sizeof(a)/sizeof(a[0]);//数组占⽤总内存除以单个元素所占的内存。
printf("数组的长度:%2d",i);//输出数组有⼏个元素的。
}BUT:1)sizeof(a)是不能获取数组中元素的个数的,因为数组中还有个\0的结束符,此处得出的必定是多出⼀个元素!2)但是通过数组名参数传递⼦函数中是⾏不通的:2.sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象 );2) sizeof( type_name ); // sizeof( 类型 );3) sizeof object; // sizeof 对象;所以:{int i;sizeof(i);//This is right!sizeof(int);//This is right!sizeof i;//this is right!sizeof int;//this is wrong!}BUT:C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下⾯这些写法都是错误的:sizeof( foo );// errorvoid foo2() { }sizeof( foo2() );// errorstruct S{unsigned int f1 : 1;unsigned int f2 : 5;unsigned int f3 : 12;};sizeof( S.f1 );// error3. sizeof的常量性sizeof的计算发⽣在编译时刻,所以它可以被当作常量表达式使⽤,如:char ary[ sizeof( int ) * 10 ]; // ok最新的C99标准规定sizeof也可以在运⾏时刻进⾏计算,如下⾯的程序在Dev-C++中可以正确执⾏:int n;n = 10; // n动态赋值char ary[n]; // C99也⽀持数组的动态定义printf("%d/n", sizeof(ary)); // ok. 输出10但在没有完全实现C99标准的编译器中就⾏不通了,上⾯的代码在VC6中就通不过编译。
标准c语言笔试题
标准c语言笔试题标准c语言笔试题引导语:在应聘与c语言相关岗位的工作时会要求进行笔试,以下是店铺整理的标准c语言笔试题,欢迎参考阅读!1. 局部变量能否和全局变量重名?(华为)解析:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量. 比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
3. 如何引用一个已经定义过的全局变量?(华为)解析:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
4. static全局变量与普通的全局变量有什么区别?解析:1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式从以上分析可以看出,static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别: static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝5. 进程和线程的差别(微软亚洲)解析:答:线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销6. 用宏定义写出swap(x,y)(思科)解析:#define swap(x, y) x = x + y; y = x - y; x = x - y7. 什么是预编译,何时需要预编译:(思科)解析:就是指程序执行前的一些预处理工作,主要指#表示的. 何时需要预编译? 1)、总是使用不经常改动的大型代码体。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sizeof(函数名() )
sizeof 也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会 被调用,举例来说定义如下函数: int myprint() { printf(“hello\n”) ; return 0; } int main() { printf(“%d”,sizeof(mypaint())); return 0; } 结果只打印函数返回类型的 sizeof 值, 并没有打印 hello 说明函数 myprint 并没有 调用。 C99 标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被 计算 sizeof 值,即下面这些写法都是错误的: 如:sizeof(myprint) (注意 sizeof(myprint()是可以的) ) 或者 sizeof 一个 void 返回类型的函数如: void foo () { } sizeof( foo () ); 以及位域: struct S { unsigned int f1 : 1; unsigned int f2 : 5; unsigned int f3 : 12; }; sizeof( S.f1 ); 2.strlen strlen 的应用则不像 sizeof 那么广泛,strlen 的参数必须是 char *的指针,如果用 strlen 计算数据类型 strlen(int)这种用法是错误的。strlen 的计算必须依赖字符 序列中的’\0’ 字符, strlen 就是通过判断是否遇到 ’\0’ 来判断字符序列是否结束 的。 它的计算原理类似于下面的两条语句 while(*p!=’\0’) length++
C语言中sizeof与strlen区别
一.本质区别 sizeof 和 strlen 有本质上的区别。sizeof 是 C 语言的一种单目运算符,如++、-等, 并不是函数, sizeof 的优先级为 2 级, 比/、 % 等 3 级运算符优先级高, sizeof 以字节的形式给出操作数的存储空间的大小。而 strlen 是一个函数,是由 C 语言 的标准库提供的。strlen 计算的 是字符串的长度。 二.使用区别 1.sizeof sizeof 的操作数可以是数据类型、函数、变量,表达式使用方式为: (1)数据类型 sizeof (type) 例如我们要计算一个 int 型数据的存储空间可以用: sizeof(int) 。需要注意的是 sizeof 的操作数是数据类型时要加括号。其数值大小为该数据类型所占的存储空 间的字节数。 (2)变量 sizeof(变量名) 如果定义 int a ,可以使用 sizeof (a)计算 a 变量占据的存储空间。具体大小 与 a 的类型有关。 注意:由于 sizeof 是操作符 sizeof a 或 sizeof (a)都可以。 (可以不使用括号) , 如果操作数是数组名则给出数组所占用内存的字节数。 如果数组名做函数的参数 传递时退化为指针。 (3)表达式 sizeof (表达式) sizeof 可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小, 一般不会对表达式进行计算。例如:sizeof(1+1.5) (4)函数调用
strlen 的用法:分为以下几种参数 (1)char * 指针 strlen(指针名) 如果参数是指针则计算该指针指向字符序列的长度。 (以’\0’作为判断标志) 例如: 定义 char *p=“hello world”;strlen(p)=11,而 sizeof (p)=4。可以看到 strlen 计算的是指针指向的字符串的长度而 sizeof 计算的是指针本身所占用的内存空 间的大小。 (2)数组 strlen(数组名) 如果参数是数组的话,实际传递的是一个指针,strlen 会按照上面处理指针的模 式处理该数组。 我们可以看下面的例子: char a[]=”hh”; strlen(a); 很显然 strlen 的结果是 2。但是如果数组是这样赋值的呢? char a[]={‘h’,’h’}; strlen(a); 那么现在 strlen(a)的结果又是多少呢?这个数就不一定了,原因是 strlen 会去 计算 a 地址开始的字符串的长度, 由于前一种赋值方式会将 hh 以字 符串的形式 赋值给数组会将字符串结束符’\0’一同赋值,这时 strlen 就会检查到结束符停止 计算,而第二种复值方式是以单个字符的形式赋值没有结束 符’\0’,这时我们用 sizeof 得到的结果是正常的,而用 strlen 由于找不到结束符,会继续的计算直到 找到结束符为止。所以这个数