前言

了解掌握有关sizeof,strlen在指针与数组的结合使用下的求值


一、sizeof和strlen的区别?

sizeof

sizeof是运算符,参数可以是数组、指针、数据类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

sizeof不能用来返回动态分配的内存空间的大小

sizeof运算符实现的对应参数与返回值的关系
数组 int arr[ 6] 编译时分配的数组空间大小
指针char * p 存储该指针所需要的空间大小,根据32/64位不同出现4/8两种情况
类型 int 对应该数据类型的字节大小
对象 sizeof(val) 对象的实际占用空间大小
函数sizeof(add) 函数的返回类型,返回类型不能是void

strlen

strlen()是函数要在运算时才能够计算

参数必须是字符型指针(char *),且必须是‘\0’结尾

当数组名作为参数传入时,实际上数组就退化成为指针了

strlen的作用是:返回字符串的长度,该字符串可能是自己定义的,也可能是内存中随机的,该函数的实际完成的功能是从代表字符串的第一个地址开始遍历,直到遇到结束符‘\0’,返回的长度大小不包括‘\0’

二、案例

1.sizeof计算整型数组的几种情况

代码如下(示例):

#include <stdio.h>
int main(void)
{int a[] = {1, 2, 3, 4};//16 4 4 4 4 4 16 4 4 4printf("一维数组计算:\n");printf("%d\n", sizeof(a));//16 sizeof(数组名)-数组名表示整个数组的-计算整个数组的大小printf("%d\n", sizeof(a + 0));
// 4/8 a+0是首元素的地址,首元素的地址+0 sizeof(a + 0)计算的是地址的大小随着32/64位电脑改变printf("%d\n", sizeof(*a));
//4 此处a表示首元素的地址,1的地址被解引用,表示的是第一个元素的大小printf("%d\n", sizeof(a + 1));
//4/8 a+1表示的是第二个元素的地址,sizeof(a+1)计算地址的大小随着32/64位电脑改变printf("%d\n", sizeof(a[1]));
//4 计算第二个元素的大小printf("%d\n", sizeof(&a));
// 4/8 &数组名-数组名表示整个数组-取出的是整个数组的大小,&a虽然是数组的地址,但也是地址,sizeof(&a)也是地址的大小 4/8printf("%d\n", sizeof(*&a));
// 16 //&a int(*p)[4] = &a;解引用(*)&a找到的是数组的大小printf("%d\n", sizeof(&a + 1));//4/8 &a + 1是跳过整个数组之后,数组后面的空间的大小printf("%d\n", sizeof(&a[0]));
//4/8 取出第一个元素的地址printf("%d\n", sizeof(&a[0] + 1));
//4/8 取出第一个元素地址 + 1也就是第二个元素的地址

2.sizeof计算字符数组的几种情况

//sizeof计算字符数组:sizeof计算所占空间大小printf("字符数组计算:\n");char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};printf("%d\n", sizeof(arr)); //6 不包括/0printf("%d\n", sizeof(arr + 0));
// 4/8 此处arr没有取地址符号,也没有单独放到sizeof里面,因此求的是地址,字符的地址也是地址,只是char所占的空间是1但不是地址大小printf("%d\n", sizeof(*arr));  // 1 解引用是aprintf("%d\n", sizeof(arr[1])); //1 b的大小printf("%d\n", sizeof(&arr)); // 4/8 数组的地址printf("%d\n", sizeof(&arr + 1)); //4/8 数组的地址+1 还是地址printf("%d\n", sizeof(&arr[0] + 1)); // 4/8 b的地址

3.strlen计算字符数组的几种情况

    //strlen计算字符数组:strlen求字符串长度直到\0char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};printf("字符数组计算:\n");printf("%d\n", strlen(arr1)); //0 随机值 首元素地址 一直 找\0printf("%d\n", strlen(arr1 + 0)); //0 随机值 首元素地址+0printf("%d\n", strlen(*arr1));//出错 找到a对应的ASCII值97,此处会出错printf("%d\n", strlen(arr1[1]));//出错 找到strlen(b)即 strlen(98)未知内存会出错printf("%d\n", strlen(&arr1));// &arr取出数组的地址往后找 得到随机值printf("%d\n", strlen(&arr1 + 1)); //随机值printf("%d\n", strlen(&arr1[0] + 1));//随机值

4.sizeof计算字符串长度的几种情况

    char arr[] = "abcdef";//[a b c d e f \0]printf("%d\n", sizeof(arr)); //7printf("%d\n", sizeof(arr + 0));//4/8printf("%d\n", sizeof(*arr));//1printf("%d\n", sizeof(arr[1]));//1printf("%d\n", sizeof(&arr));//4/8printf("%d\n", sizeof(&arr + 1));//4/8printf("%d\n", sizeof(&arr[0] + 1));//4/8 首元素地址+1 = 第二个元素的地址

5.strlen计算字符串长度的几种情况

    printf("strlen计算字符串长度\n");char arr[] = "abcdef";//[a b c d e f \0]printf("%d\n", strlen(arr));
//6 此处的arr为首元素的地址printf("%d\n", strlen(arr + 0));
//6 此处的arr为首元素的地址printf("%d\n", strlen(*arr));
//错误 给的是a的ASCII码值,从97开始数printf("%d\n", strlen(arr[1]));
//错误 给的是b的ascii码值,从98开始数printf("%d\n", strlen(&arr));//6printf("%d\n", strlen(&arr + 1));
//错误 从a的地址直接跳过整个数组的地址,得到随机值printf("%d\n", strlen(&arr[0] + 1));
//5 从b开始往后数到\0得到5

6.sizeof计算指针字符串长度的几种情况

    char* p = "abcdef";// a b c d e f \0 指针p指向起始位置a的地址printf("%d\n", sizeof(p));//4/8printf("%d\n", sizeof(p + 1));//4/8printf("%d\n", sizeof(*p));//1printf("%d\n", sizeof(p[0]));//1 p[0] = *(p + 0)printf("%d\n", sizeof(&p));//4/8printf("%d\n", sizeof(&p + 1));//4/8printf("%d\n", sizeof(&p[0] + 1));//4/8

7.strlen计算指针字符串长度的几种情况

    char* p = "abcdef";printf("%d\n", strlen(p));//6printf("%d\n", strlen(p + 1));//5printf("%d\n", strlen(*p));// 97 错误printf("%d\n", strlen(p[0]));// 98 错误printf("%d\n", strlen(&p));//随机 不知p的地址为何printf("%d\n", strlen(&p + 1)); //随机 不知p的地址为何printf("%d\n", strlen(&p[0] + 1)); //5

总结

针对strlen和sizeof运算做的学习笔记,欢迎指正

c语言之sizeof与strlen全相关推荐

  1. C语言的sizeof和strlen

    strlen是函数,而sizeof是算符.strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用已知字符串进行了初始化,起长度是固定的,所以sizeof在编译时计算缓冲区的长度. ...

  2. 【C语言】sizeof和strlen的区别

    一.size和strlen的异同 二.数组名意义的两个特例 三.结合实例分清sizeof和strlen 1.一维数组 易错解析 2.字符数组 易错解析 3.二维数组 易错解析 一.size和strle ...

  3. c语言sizeof和strlen哪个大,C语言的sizeof和strlen区别与联系

    sizeof指的是占有空间的大小,包括字符串结束的\0.strlen是计算字符串长度,以\0作为结束标志,并且\0不计入数值. #include #include using namespace st ...

  4. C语言再学习 -- 关键字sizeof与strlen

    sizeof  一.简单介绍 sizeof 是 C 语言的一种单目操作符,如 C 语言的其他操作符++.--等.它并不是函数.C 规定 sizeof 返回 sieze_t 类型的值.这是一个无符号整数 ...

  5. c语言sizeof strlen,C语言中sizeof与strlen区别

    一.本质区别 sizeof 和strlen 有本质上的区别.sizeof 是C 语言的一种单目运算符,如++.--等,并不是函数,sizeof 的优先级为2 级,比/.% 等3 级运算符优先级高,si ...

  6. 【C 语言】字符串操作 ( strlen 与 sizeof 函数 | 计算 字符串长度 与 内存块大小 )

    文章目录 一.strlen 与 sizeof 函数 二.计算 字符串长度 与 内存块大小 一.strlen 与 sizeof 函数 strlen() 函数的作用是获取字符串大小 , 其原理是 从 内存 ...

  7. C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程

    目录 一.sizeof 函数与 strlen 函数区别 1.获取字符串长度 – 针对字符串 2.获取指针/数组长度 – 针对指针/数组 3.sizeof 获取内存大小 4.经典案例 二.猜你喜欢 零基 ...

  8. c语言sizeof测量字符组长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

  9. c语言字符数组的实际长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

  10. 如何求C语言字符串长度(strlen函数和sizeof关键字)

    如何求C语言字符串长度(strlen函数和sizeof关键字) 在程序里,一般会用***strlen()***函数或***sizeof()***来获取一个字符串的长度,但这2种方法获取的字符串的长度其 ...

最新文章

  1. 直播回顾 | 最强中文NLP预训练模型艾尼ERNIE官方揭秘
  2. 三面百度AI岗,炸了
  3. 花5分钟时间来了解一下高性能网关Kong会有意外收获
  4. 域名服务器的配置文档,dns域名服务器的配置
  5. android 热修复 需要重启应用嘛?_Android热修复方案盘点
  6. 【Processing学习笔记】安装与入门
  7. 使用XLocalizer进行ASP.NET Core本地化
  8. java(15)-策略模式(Strategy Pattern)
  9. Energetically Consistent Invertible Elasticity
  10. SpringBoot之可视化api
  11. Extjs window autoload
  12. 功率曲线k值_锂电池放电曲线全面解析
  13. 下一代CRM是怎么样的?
  14. 华为+android+root权限获取root,华为root权限怎么开启怎么获取(简单华为手机ROOT教程)...
  15. GC5958三相无刷(BLDC)无感正弦波电机驱动芯片 替代APX9358
  16. “四”才是中国人的吉祥数字!
  17. Unity WebGL(一)Unity和JS交互
  18. 如何用java实现发邮件功能
  19. hiredis的异步处理
  20. 服务器装系统步骤图解win7,怎么装win7系统?本地硬盘安装win7/XP系统详细教程

热门文章

  1. 【stata】如何快速上手stata软件
  2. java gbk编码_Java GBK 中文乱码问题分析
  3. Ceres-Solver安装与简介
  4. Vivado时钟之间的三种关系
  5. 【图像隐藏】基于matlab像素预测和位平面压缩的加密图像可逆数据隐藏【含Matlab源码 2218期】
  6. Wireshark用户使用手册系列完结篇
  7. IOS10上崩溃错误“View has lost track of its superview, most likely through unsupported use of CALayer”解决方案
  8. java编程获取屏幕分辨率_Java及Jquery获取屏幕分辨率的实现代码
  9. Python实现四子棋(四连环)游戏
  10. 基于Android的减肥塑身平台