《重生到现代之从零开始的C语言生活》—— 指针7

2024-09-04 02:12

本文主要是介绍《重生到现代之从零开始的C语言生活》—— 指针7,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

sizeof和strlen的对比

sizeof

sizeof是一个操作符,计算的是所占据内存的大小,单位是字节

sizeof操作符只关注内存的大小,不关心内存中存放的是什么数据

strlen

strlen是C语言的库函数,头文件是string.h功能是求当中字符串字符中的个数

strlen函数会一直找\0,当函数找\0字符时,就是\0之前字符串中字符的个数

如果没有\0,strlen函数会一直向后找\0,直到找到为止

试题讲解

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
//sizeof计算的是占用内存的大小,但是之前有说过,sizof(数组名)表示的是整个数组的地址,既然是地址,那就是4/8字节
printf("%d\n",sizeof(a+0));
//sizeof 后面不是直接跟数组名,数组名就是数组头文件的地址,+0还是数组头文件的地址,既然是地址就是4/8个字节
printf("%d\n",sizeof(*a));
//sizef后面是取地址数组首元素的的地址,就是a这个元素,首元素的大小,4个字节
printf("%d\n",sizeof(a+1));
//sizef后面的是数组首元素的地址加一,就是第二个元素的地址,还是4/8个字节
printf("%d\n",sizeof(a[1]));
//表示数组第二个元素,表示“2”,就是四个字节
printf("%d\n",sizeof(&a));
//取地址a数组,是地址,就是4/8个字节
printf("%d\n",sizeof(*&a));
//取地址后解引用,就是这个数组,计算整个数组的大小,数组中储存了4个整型,就是16个字节
printf("%d\n",sizeof(&a+1));
//取地址a就是a的地址,加一就是数组a后面的地址,还是地址,所以是4/8个字节
printf("%d\n",sizeof(&a[0]));
//取地址,取数组第一个元素的地址,4/8个字节
printf("%d\n",sizeof(&a[0]+1));
//取数组第一个元素的地址,加一后就是数组第二个元素的地址,就是4/8个字节
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//sizeof数组名就是整个数组的地址,地址就是4/8个字节
printf("%d\n", sizeof(arr+0));
//arr是首元素的地址,加0还是首元素的地址,地址就是4/8个字节
printf("%d\n", sizeof(*arr));
//arr是首元素的地址,解引用的结果就是首元素,首元素为字符,一个字节
printf("%d\n", sizeof(arr[1]));
//数组的第二个元素,是字符类型,一个字节
printf("%d\n", sizeof(&arr));
//取地址arr,取得是整个元素的地址,地址就是4/8个字节
printf("%d\n", sizeof(&arr+1));
//取地址arr,取得是整个元素的地址,加1后还是地址,地址就是4/8个字节
printf("%d\n", sizeof(&arr[0]+1));
//取首元素的地址,加1后就是第二个元素的地址,就是4/8个字节
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
//数组里面确定没有/0,所以strlen不能停下,随机值
printf("%d\n", strlen(arr+0));
//加0后依旧没有确定/0,随机值
printf("%d\n", strlen(*arr));
//解引用首元素地址,结果就是首元素,'a'-97,这里是把97传给strlen,strlen会把97当做地址,向后统计字符串长度,97作为地址的空间,不一定属于当前程序,会非法访问导致报错
printf("%d\n", strlen(arr[1]))
//数组第二个元素,情况和上面一样
printf("%d\n", strlen(&arr));
//取整个数组的地址,strlen函数从第一个元素开始向后统计字符串长度,由于没有确定的/0,所以还是随机值
printf("%d\n", strlen(&arr+1));
//取数组地址,加一后为数组后面的地址,由于没有确定的/0,所以还是随机值
printf("%d\n", strlen(%arr[0]+1))
//取首元素的地址,加一是第二个元素的地址,还是随机值
char arr[] = "abcdef";
//看似里面只有6个元素,但实际里面储存了有a,b,c,d,e,f,/0
printf("%d\n", sizeof(arr));
//6个整型类型的元素,但是还有一个/0,,7个字节
printf("%d\n", sizeof(arr+0));
//首元素的地址加一是第二个元素的地址,4/8个字节
printf("%d\n", sizeof(*arr));
//解引用首元素的地址就是首元素,首元素就是1个字节
printf("%d\n", sizeof(arr[1]));
//第二个元素,第二个元素还是1个字节
printf("%d\n", sizeof(&arr));
//取整个数组的地址,地址就是4/8个字节
printf("%d\n", sizeof(&arr+1));
//去整个数组的地址加一还是地址,地址就是4/8个字节
printf("%d\n", sizeof(&arr[0]+1));
//取首元素的地址加一,还是地址,4/8个地址
char arr[] = "abcdef";
//看似里面只有6个元素,但实际里面储存了有a,b,c,d,e,f,/0
printf("%d\n", strlen(arr));
//数组里有6个元素(/0前面有六个元素),结果是6
printf("%d\n", strlen(arr+0));
//还是数组的地址,6
printf("%d\n", strlen(*arr));
//arr是数组首元素的地址,解引用的结果就是第一个元素,由于没有确定/0的位置,所以就是随机值
printf("%d\n", strlen(arr[1]));
//第二个元素,由于没有/0确定的位置,所以是随机值
printf("%d\n", strlen(&arr));
//取的是整个数组的地址,还是6
printf("%d\n", strlen(&arr+1));
//数组地址加1,没有确定的/0,就是随机值
printf("%d\n", strlen(&arr[0]+1));
//第一个元素的地址加一就是第二个元素,由于没有确定/0的位置,所以是随机值
char *p = "abcdef";
//p是指针变量,里面存放其实是首字符a的地址
printf("%d\n", sizeof(p));
//指针变量里存放的是地址,所以指针变了的大小就是4/8个字节
printf("%d\n", sizeof(p+1));
//p里面储存的是首字符a的地址,加一就是第二个字符的地址,4/8个字节
printf("%d\n", sizeof(*p));
//p里面储存的是首字符的地址,解引用之后就是a,1个字节
printf("%d\n", sizeof(p[0]));
//我们把常量字符串看成数组,p[0]就是第一个元素,1个字节
printf("%d\n", sizeof(&p));
//取p这个指针变量的地址,4/8个字节
printf("%d\n", sizeof(&p+1));
//加一后还是地址,4/8个字节
printf("%d\n", sizeof(&p[0]+1));
//取首字符的地址,加一后就是第二个字符的地址,4/8个字节
char *p = "abcdef";
printf("%d\n", strlen(p));
//里面有6个字符,就是6
printf("%d\n", strlen(p+1));
//加一后从第二个字符开始统计,5
printf("%d\n", strlen(*p));
//p是首字符的地址,解引用就是“a”,会把97传给strlen,造成报错
printf("%d\n", strlen(p[0]));
//p[0]就是“a”,会把97传给strlen,造成报错
printf("%d\n", strlen(&p));
//取指针变量p的地址,后面没有确定的/0,所以是随机值
printf("%d\n", strlen(&p+1));
//取的是指针变量的地址,加一后,没有确定的/0的位置,所以是随机值
printf("%d\n", strlen(&p[0]+1));
//取收字符的地址,加一后就是第二个元素的地址,往后统计,5

今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!
祝看到这里的人天天开心哦(笔芯)

这篇关于《重生到现代之从零开始的C语言生活》—— 指针7的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134708

相关文章

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细