C语言中sizeof()与strlen()函数的使用入门及对比_C 语言

sizeof()函数
1,是什么?
    sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换。虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是两码事。
2,有什么用?
    sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位。
3,怎么用?
    sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量的存储空间。当对变量用的时候,也可以没有括号,直接 sizeof 变量,但一般不用(我一般都是只记一种通用的用法……)。
4,用的时候要注意什么?
(1)sizeof返回的占用空间大小是为这个变量开辟的大小,而不只是它用到的空间。和现今住房的建筑面积和实用面积的概念差不多。所以对结构体用的时候,大多情况下就得考虑字节对齐的问题了。
(2)对位域成员等连编译器都无法确定存储空间的东西不能用。这个应该比较好理解,因为sizeof返回的都是以字节为单位的数据,你让它去求那些以位为单位的大小,这不是存心难为编译器嘛。所以编译器采用的方案是统一不受理,即使你说你刚好是8位,占一个字节,编译器也不理你。
(3)sizeof返回的数据类型是unsigned int。因为C中不同类型数据混合运算时的自动转换,有时候不注意的话可能会出问题,具体可以参照下面的程序例子。
(4)要注意数组名和指针变量的区别。通常情况下,我们总觉得数组名和指针变量差不多,但是在用sizeof的时候差别很大,对数组名用sizeof返回的是整个数组的大小,而对指针变量进行操作的时候返回的则是指针变量本身所占得空间,在32位机的条件下一般都是4。而且当数组名作为函数参数时,在函数内部,形参也就是个指针,所以不再返回数组的大小。
5,实例分析
源码:

#include<stdio.h>

int main()
{
    int iVal = 3;
    printf("The size of type int is %d \n", sizeof(int));
    printf("The size of iVal is %d\n", sizeof(iVal));
    printf("The size of iVal is %d\n", sizeof iVal);

    if((iVal - sizeof(int)) < 0)
    {
        printf("The return type is int\n");
    }
    else
    {
        printf("The return type is unsigned int\n");
    }

    char chArrayCon[7];
    char *chp;
    chp = chArrayCon;
    printf("The size of chArrayCon is %d, The size of chp is %d\n", sizeof(chArrayCon), sizeof(chp));

    int iArraySize = 3;
    char chArrayVar[iArraySize];
    printf("The size of chArrayVar is %d\n", sizeof(chArrayVar));
    return 0;
}

运行结果:

The size of type int is 4
The size of iVal is 4
The size of iVal is 4
The return type is unsigned int
The size of chArrayCon is 7, The size of chp is 4
The size of chArrayVar is 3

结果分析:
    代码第一部分主要就是简单的表示了一下用法。
    第二部分说明了注意事项的第三项。按说,iVal的值是3,减4的话应该是-1,小于0,输出的应该是"he return type is int"。但是由于当int和unsigned int一起运算时,会默认变成unsigned int,所以结果会是一个很大的unsigned int类型的数,是大于0的。
    代码第三部分就简单说明了数组名和指针变量的区别,即使你把指针变量指向数组名,编译器依然能够分辨出区别。

    以上讲述的都没有考虑在C99标准下的情况。因为在C99标准下有种特殊情况,那就是不定长数组的使用。当对不定长数组名使用sizeof的话,返回的也是整个数组的大小,就像实例中第四块代码一样。但是这并不是在编译阶段执行的,而是在程序运行阶段执行的。因为在编译的时候,编译器一般不知道变量的值是多少。(当然例子中我直接赋值3,可能不方便理解,可以假想iArraySize是通过scanf来获得实际数值的,然后再声明数组的)。对于这种情况,实际中应用的并不多,大家可以当做特殊情况对待即可,或者直接忽略掉也行……
6总结
    其实sizeof的作用就是告诉我们分配给变量的“建筑面积”的大小,只要记得这一点应该就够了,不管这个变量类型是普通的整型数据,还是结构体,共用体,枚举……记住这一点后,当我们再去想知道sizeof对不同数据类型操作返回的值到底是什么的时候,只需搞明白那些数据类型到底要消耗多少“建筑面积”就可以啦!

strlen()函数
C库函数 size_t strlen(const char *str) 计算字符串str的长度,但不包括终止空字符。

声明
以下是声明的strlen() 函数。

size_t strlen(const char *str)

参数
str -- 这是字符串的长度要计算的。

返回值
这个函数返回字符串的长度。

例子
下面的例子显示使用strlen() 函数。

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[50];
  int len;

  strcpy(str, "This is yiibai.com");

  len = strlen(str);
  printf("Length of |%s| is |%d|
", str, len);

  return(0);
}

让我们编译和运行上面的程序,这将产生以下结果:

Length of |This is yiibai.com| is |26|

sizeof与strlen的用法区别
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

2. sizeof是运算符(C++ 关键字),strlen是函数。

3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。sizeof还可以用函数做参数,比如:

short f();
printf("%d\n", sizeof(f()));

输出的结果是返回值的类型的大小, 即sizeof(short)=2。

4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。

char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //b=20;

而strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

5. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

6. 当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 得到全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

7. 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

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对指针的话,结果是相应的类型:

char* ss = "0123456789";
sizeof(ss)

结果是4 => ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4. sizeof(*ss) 结果 1, => *ss是第一个字符,其实就是获得了字符串的第一位“0” 所占的内存空间,是char类型的,占了1个字节,strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, strlen
, sizeof
, 入门
C语言入门
c语言sizeof和strlen、c语言 sizeof strlen、sizeof和strlen的区别、sizeof strlen、strlen sizeof 区别,以便于您获取更多的相关知识。

时间: 2024-09-07 13:45:44

C语言中sizeof()与strlen()函数的使用入门及对比_C 语言的相关文章

详解C语言中的char数据类型及其与int类型的转换_C 语言

C语言中的char变量 char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed.虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围是0~127),但实际情况中究竟是signed还是unsigned取决于编译器. 可通过下面程序判断编译器的默认char类型: void char_type() { char c=0xFF; if(c==-1) printf

c语言中malloc、realloc与calloc 的区别以及联系_C 语言

ANSI C说明了三个用于存储空间动态分配的函数(1) malloc分配指定字节数的存储区.此存储区中的初始值不确定 (2) calloc为指定长度的对象,分配能容纳其指定个数的存储空间.该空间中的每一位(bit)都初始化为0 (3) realloc  更改以前分配区的长度(增加或减少).当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定 .分配函数时再分配 realloc()使我们可以增.减以前分配区的长度(最常见的用法是增加该区). 如果先分配一个可容

C语言中auto,register,static,const,volatile的区别详细解析_C 语言

1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)register这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率. (3)static常见的两种用途:1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型.在一

解析c语言中&amp;quot;函数调用中缺少哨兵&amp;quot;的情况分析_C 语言

在写一个练习时候出现的.觉得奇怪,因为翻译说缺少哨兵??什么意思呢...===================================== 复制代码 代码如下: /*//练习如下,创建一个进程*/#include <unistd.h>#include <stdio.h>#include <stdlib.h> int main(void){   printf("Running ps with execlp\n");   execlp("

对C语言中sizeof细节的三点分析介绍

以下是对C语言中sizeof的细节进行了详细的分析介绍,需要的朋友可以参考下   1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行.那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试的一道题,小编理解: 复制代码 代码如下: #include<iostream> using namespace std; int main() {     int i=1;     cout<<i<<endl;     sizeof(

详解C语言中scanf函数使用的一些注意点_C 语言

 (一)基本介绍 Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#include<stdio.h>头文件.当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名.是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕.敲回车键告知计算机键入完毕. (二)使用注意 ①. 使用scanf函数输入一个字符变量.Char a; scanf("%c",&a); ②. 同时输入多

C语言的getc()函数和gets()函数的使用对比_C 语言

C语言getc()函数:从流中读取字符头文件: #include <stdio.h> 函数getc()用于从流中取字符,其原型如下: int getc(FILE *stream); [参数]参数*steam为要从中读取字符的文件流. [返回值]该函数执行成功后,将返回所读取的字符. [说明]若从一个文件中读取一个字符,读到文件尾而无数据时便返回EOF.getc()与fgetc()作用相同,但在某些库中getc()为宏定义,而非真正的函数. [实例]下面的示例演示了getc()函数的使用,在程序

对C语言中sizeof细节的三点分析介绍_C 语言

1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行.那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试的一道题,小编理解: 复制代码 代码如下: #include<iostream> using namespace std; int main() {     int i=1;     cout<<i<<endl;     sizeof(++i);     cout<<i<<endl;    

C语言中fgetgrent()函数和fgetpwent()函数的用法对比_C 语言

C语言fgetgrent()函数:读取组格式函数 头文件: #include <grp.h> #include <stdio.h> #include <sys/types.h> 定义函数: struct group * getgrent(FILE * stream); 函数说明:fgetgrent()会从参数stream 指定的文件读取一行数据, 然后以group 结构将该数据返回. 参数stream 所指定的文件必须和.etc/group 相同的格式. group 结