首页 > 其他分享 >sizeof解析式分析

sizeof解析式分析

时间:2023-07-20 19:45:35浏览次数:39  
标签:分析 元素 地址 数组 printf sizeof 解析 strlen

sizeof

类型:

sizeof()是表达式不是函数

用处:

可以用来求变量 、数组、对象、结构体等所占空间的大小,其实只要将sizeof()操作的参数理解成类型

混淆点:

sizeof() 和 数组
        只有两种情况下数组名可以表示整个数组:

(1)sizeof(数组名):此处数组名不能修饰,否则表示数组首元素的地址

(2)&数组名

其他时候像数组名单独使用,或者是sizeof内部谁数组名相关表达式都表示的是数组首元素的地址。

整型数组:
 int a[] = { 1, 2, 3, 4 }; 
 printf("%d\n", sizeof(a));//16:a数组名单独使用表示整个数组,由于每个元素是int类型,所以结果为4*4=16 
 printf("%d\n", sizeof(a+0));//4:数组首元素的地址的大小 
 printf("%d\n", sizeof(*a));//4:数组第0个元素的大小(int类型的) 
 printf("%d\n", sizeof(a+1));//4:数组第1个元素的大小 
 printf("%d\n", sizeof(a[1]));//4:数组第1个元素的大小 
 printf("%d\n", sizeof(&a));//4(数组首元素的地址) 
 printf("%d\n", sizeof(&a+1));//4(第1个元素的地址) 
 printf("%d\n", sizeof(&a[0]));//4(第0个元素的地址) 
 printf("%d\n", sizeof(&a[0]+1));//4(第1个元素的地址)
sizeof和字符数组:
char a[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(a));//6:求的是整个数组的大小,由于每个元素大小是1,所以结果是6
printf("%d\n", sizeof(a + 0));//4:求的是数组首元素的地址
printf("%d\n", sizeof(*a));//1:求的是第0个元素的大小
printf("%d\n", sizeof(a + 1));//4:求的是第1个元素的地址
printf("%d\n", sizeof(a[1]));//1:求的是第一个元素的大小
printf("%d\n", sizeof(&a));//4(数组首元素的地址)
printf("%d\n", sizeof(&a + 1));//4(第1个元素的地址)
printf("%d\n", sizeof(&a[0]));//4(第0个元素的地址)
printf("%d\n", sizeof(&a[0] + 1));//4(第一个元素的地址)
sizeof和字符串
char* p = "abcdef";
printf("%d\n", sizeof(p));//4   8:对指针变量求sizeof,32位机器在下是4,64位机器下是8如果是char p[]="abcdef";那么结果就是7,要包含'\0'
printf("%d\n", sizeof(p+1));//4   8:指针变量+1跳过一个指向的对象,指指向b结果不变,仍然是指针
printf("%d\n", sizeof(*p));//1 :相当于sizeof('a')自然是1
printf("%d\n", sizeof(p[0]));//1:同上
printf("%d\n", sizeof(&p));//4 8 :&p相当于第0个元素的地址(机器不同大小也不同)
printf("%d\n", sizeof(&p+1));//4 8:第1个元素的地址
printf("%d\n", sizeof(&p[0]+1));//4 8:第一个元素的地址
sizeof和二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48:单独使用数组名,要理解成整个数组,数组存储是{{0,0,0,0},{0,0,0,0},{0,0,0,0}}所以12*4=48
printf("%d\n", sizeof(a[0][0]));//4:数组中第一个元素的大小,所以是4
printf("%d\n", sizeof(a[0]));//16:数组第0行的大小,内部包含四个元素
printf("%d\n", sizeof(a[0]+1));//4:a[0]+1=a[0][1]是一个元素
printf("%d\n", sizeof(a+1));//4:第1行的地址
printf("%d\n", sizeof(&a[0]+1));//4:第一行的地址
printf("%d\n", sizeof(*a));//16:如果是一维数组表示第一个元素,二维数组表示第0行元素
printf("%d\n", sizeof(a[3]));//16:
strlen:

返回C风格字符串的长度,特殊的也可以求字符数组的长度

字符数组和strlen

字符串两种定义方式:

1、char* str="abcdfe";
2、char str[]="abcdfe";

要区别字符数组和字符串和字符串第二种定义方式的区别

字符串如果写成字符数组应该是,char str[]={'a','b','c','d','f','e','\0'};

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(arr));//随机数(strlen再求字符串的长度的时候是以'\0'作为结束标志的,此处没有'\0'自然就是随机数了
printf("%d\n", strlen(arr+0));//随机数和上面结果相同但是意义不同,上面纯粹是求字符数组的长度,下面是从第一个元素a开始求之后的长度
printf("%d\n", strlen(*arr));//出错(此处他把*arr='a'(97当做起始地址去找,但是这块地址是不能访问的)
printf("%d\n", strlen(arr[1]));//出错:类型问题(地址是常量)
printf("%d\n", strlen(&arr));//出错:类型问题
printf("%d\n", strlen(&arr+1));//出错;类型问题
printf("%d\n", strlen(&arr[0]+1));//随机数-1(是从b开始向后求长度)
strlen和字符串
char* p = "abcdef";
printf("%d\n", strlen(p));//6:p指向字符串开始的位置,strlen就从指向的位置往下计数,遇到'\0'才停止   
printf("%d\n", strlen(p+1));//5:p+1,实际上加得是指向对象的大小,所以指向b,从b向后数遇到'\0'停止。
printf("%d\n", strlen(*p));//出错
printf("%d\n", strlen(p[0]));//出错
printf("%d\n", strlen(&p));//出错
printf("%d\n", strlen(&p+1));//出错
printf("%d\n", strlen(&p[0]+1));//5:p[0]就是首元素a,在&操作后就是a的地址,+1,就指向了b,从b向后计算长度

————————————————
参考原文链接:https://blog.csdn.net/cx2479750196/article/details/81288989

标签:分析,元素,地址,数组,printf,sizeof,解析,strlen
From: https://www.cnblogs.com/bigflyny/p/17569464.html

相关文章

  • MySQL之sql性能分析
    MySQL之sql性能分析sql性能分析慢查询日志慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志MySOL的慢查询日志默认没有开启,需要在MvSOL的配置文件(/etc/my.cnf)中配置如下信息:#查询slow_query_log开启了没有showvariables......
  • C++ 模板编程技术解析
    一、函数模板函数模板实现通用函数,根据传递类型进行编译时实参推导:template<typenameT>Tadd(Ta,Tb){returna+b;}intmain(){intx=1,y=2;doublem=1.5,n=2.5;intz=add(x,y);doublep=add(m,n);return0;}这里te......
  • 由浅入深:Stable-Diffusion 原理解析01 —— 基本概念的介绍
    由浅入深:Stable-Diffusion原理解析01——基本概念的介绍由于实习工作需要,最近一段时间的学习,自己也对Stable-Diffusion有了一些基础的理解,在学习和阅读论文的过程中,发现信息比较碎片化,于是决定产出一个SD原理的系列解析。本系列相比于本人之前的代码阅读系列没那么“硬核......
  • MAUI+MASA Blazor 兼容性测试报告及分析
    目录1背景2目的3.测试目标4.预期结果5.测试策略及范围6.测试结果与分析7.附加内容8.结尾1背景MASABlazor组件是一款基于MaterialDesign设计和BlazorComponent的交互能力提供标准的基础组件库。提供如布局、弹框标准、Loading、全局异常处理等标准场景的预置组件。它旨在为......
  • C++/C的#pragma参数选项及其解析
    每种C和C++的实现支持对其宿主机或操作系统唯一的功能。例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式。#pragma指示使每个编译程序在保留C和C++语言的整体兼容性时提供不同机器和操作系统特定的功能。编译指示被定义为机器或操作系统特定的,并且......
  • ASEMI快恢复二极管MURF20100CT特性及应用解析
    编辑-Z本文主要介绍MURF20100CT二极管的基本特性及其在电路设计中的应用。首先介绍该二极管的基本结构和特性参数,然后重点讲解其应用场景和具体的电路设计方法。最后总结MURF20100CT二极管的优势和使用注意事项。 一、MURF20100CT二极管的基本特性MURF20100CT二极管是一种具......
  • 【网易云信】直播场景播放侧常见问题分析与实践经验
    常见的播放流程播放器主要流程分析 播放器的播放流程与推流过程类似,但是顺序相反。推流端先采集音频和视频,进行音视频编码和封装,并按照流媒体协议进行处理,最终得到输出流。而播放器则将输入流经过解析和解封装,得到音频包(如AAC)和视频包(如H.264、H.265),并进行解码以获取音频帧......
  • Elm 和 Jetpack Compose 殊途同归及 MVVM 缺点分析
    Html.lazy·AnIntroductiontoElm可能搞vdom的都会到lazyrenderer这一步,react可能也可以这么搞或者已经这么搞了我不知道,Elm提到的keyedreact也是一个主要特性:Html.keyed·AnIntroductiontoElm但添加元素、删除元素、元素交换位置、以及元素移动位置的问题真......
  • Jedis 参数异常引发服务雪崩案例分析
    作者:vivo互联网服务器团队-WangZhiRedis作为互联网业务首选的远程缓存工具而被大面积使用,作为访问客户端的Jedis同样被大面积使用。本文主要分析Redis3.x版本集群模式发生主从切换场景下Jedis的参数设置不合理引发服务雪崩的过程。一、背景介绍Redis作为互联网业务首选......
  • Day-4 返回值源码分析
    1.常见的返回类型HttpResponse,redirect,render,JsonResponse1.1HttpResponse  前置知识点 ......