C语言中sizeof()和strlen()的区别

《sizeof》

(一)、sizeof的基本概念

sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号
内的类型名。操作数的存储大小由操作数的类型决定。

(二)使用方法

1、用于数据类型

sizeof使用形式:sizeof(type) ,如sizeof(int)

2、用于变量
sizeof使用形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带上括号的用法更普遍。建议像我们初学的小白们大家都带上括号比较好。嘻嘻!!!
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

(三)、常用类型的对齐方式

类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
char偏移量必须为sizeof(char)即1的倍数
int偏移量必须为sizeof(int)即4的倍数
double偏移量必须为sizeof(int)即4的倍数
short偏移量必须为sizeof(short)即2的倍数
float偏移量必须为sizeof(float)即4的倍数

(四)、sizeof用法总结

1. 参数为数据类型或者为一般变量。

例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节,在64位系统中占8个字节。

2. 参数为数组或指针
下面举例说明.
int a[50];         //sizeof(a)=4*50=200; 求数组所占的空间大小

int *a = new int[50]; // sizeof(a)=4; a为一个指针,sizeof(a)是求指针的大小,在32位系统中,当然是占4个字节。

小秘诀:sizeof(数组名):求取的是数组的整体大小哦

&数组名:求取的是数组的整体大小哦

其他情况均为数组首元素的地址

《strlen》

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

1、声明

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

size_t strlen(const char *str)
2、参数

str – 这是字符串的长度要计算的

3、返回值

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

例子

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

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

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

  strcpy(str, "guozhaozhao");

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

  return(0);
}

这里写图片描述

例题解析

字符数组例题

#inlcude<stdio.h>
#include <string.h>
int main()
{   
    char *p = "abcdef";//字符串
    char arr1[] = "abcdef";//字符串
    char arr2[] = {'a','b','c','d','e','f'};//6个字符。没有\0
    printf("%d\n",sizeof(p));//结果为:4  p为一个指针变量,所有类型的指针的大小都是四个字节。(32系统)
    printf("%d\n",sizeof(arr1));//结果为:7 arr1为数组名,放进去求的是数组的总大小。记住arr1中的字符串还包含有\o。
    printf("%d\n",sizeof(arr2));//结果为:6
    printf("%d\n",strlen(p));//结果为:6  \0不统计
    printf("%d\n",strlen(arr1));//结果为:6 \0不统计
    printf("%d\n",strlen(arr2));//结果为:没有\0 是一个随机值
    return 0;
}
#inlcude<stdio.h>
#include <string.h>
int main()
{   
    char *p = "abcdef0\0";//字符串
    char arr1[] = "abcdef0\0";//字符串
    char arr2[] = {'a','b','c','d','e','f','0','\0'};
    printf("%d\n",sizeof(p));//结果为:4  
    printf("%d\n",sizeof(arr1));//结果为:9 
    printf("%d\n",sizeof(arr2));//结果为:8
    printf("%d\n",strlen(p));//结果为:7 
    printf("%d\n",strlen(arr1));//结果为:7 
    printf("%d\n",strlen(arr2));//结果为:7
    return 0;
}

一维数组的例题

#inlcude<stdio.h>
#include <string.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));//结果为:16 放的四个整型所以是4*4=16。
    printf("%d\n",sizeof(a+0));//结果为:4 第一个元素的地址。
    printf("%d\n",sizeof(*a));//结果为:4 第一个元素
    printf("%d\n",sizeof(a+1));//结果为:4 第二个元素的地址。
    printf("%d\n",sizeof(a[1]));//结果为:4 第二个元素。
    printf("%d\n",sizeof(&a));//结果为:4 数组的地址。
    printf("%d\n",sizeof(&a+1));//结果为:4 数组末尾再后面空间的地址。
    printf("%d\n",sizeof(&a[0]));//结果为:4 第一个元素的地址。
    printf("%d\n",sizeof(&a[0]+1));//结果为:4 第二个元素的地址。
    printf("%d\n",sizeof(*&a));//结果为:16 &a取出来的是整个数组的地址,对数组的地址进行* 就成了整个数组了。
    return 0;
}

二维数组的例题

#include<stdio.h>
#include<string.h>
int main()
{ 

    int a[3][4] = {0};          
    printf("%d\n",sizeof(a));   //48       整个二维数组的大小
    printf("%d\n",sizeof(a[0][0])); //4    下标为a[0][0]的长度,也就是第一行第一个元素的大小
    printf("%d\n",sizeof(a[0]));    //16   第1行的大小 第一行有四个每个又为整型 所以为16
    printf("%d\n",sizeof(a[0]+1));  //4    第一行第二个元素的地址   
    printf("%d\n",sizeof(a+1));     //4    第二行的地址   
    printf("%d\n",sizeof(&a[0]+1)); //4 第1行的地址的长度       
    printf("%d\n",sizeof(*a));      //16     第0行的长度
    printf("%d\n",sizeof(a[3]));    //16     越界了但是还是会计算出第三行的长度。
    return 0;
}
  • 23
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值