一维二维数组的指针于sizeof和strlen

news2024/12/28 4:28:09

目录

    • 一维数组于指针的一些题
    • 二维数组于指针的一些题

一维数组于指针的一些题

对数组名的理解

数组名表示首元素地址 //两个例外: //sizeof(数组名):表示计算整个数组的大小 //&数组名:这里取的也是整个数组的大小,除了他两以外其他所有数组名都是表示首元素地址的

//数组名表示首元素地址
//两个例外:
//sizeof(数组名):表示计算整个数组的大小
//&数组名:这里取的也是整个数组的大小

int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(a + 0));//(a+0)这里的a就是首元素地址  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,地址在32位机器上只有4字节
	printf("%d\n", sizeof(*&a));//16//整个数组的大小
	printf("%d\n", sizeof(&a + 1));//4相当于跳过了整个字节,但是他任然是个地址,是地址在32位机器上任然是4字节
	printf("%d\n", sizeof(&a[0]));//4
	printf("%d\n", sizeof(&a[0] + 1));//4


	return 0;
}

strlen是一个库函数,应用方法strlen(里面的参数必须是个地址)
strlen求字符数组长度时,先找到首元素的地址然后向后一直计算,直到碰到’\0’才会停止,然后取计算\0前面的字符串个数(字符串的\0,是要自己写的)

	char arr[6] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));//随机数,因为char arr[] = { 'a','b','c','d','e','f' };里面没有写\0,所以他计算到最后一个字符的时候不会停止,就越界了,
	printf("%d\n", strlen(arr + 0));//随机数  和第一个一样,注意strlen(数组名);里面的数组名就是首元素地址
	printf("%d\n", strlen(*arr));//非法访问   strlen函数需要的参数应该是个地址,而传给他的却是字符a,字符a的ASCII值为97,那么就是把97作为地址传给了strlen函数,就发生了非法访问
	printf("%d\n", strlen(arr[1]));//非法访问  跟上面一样
	printf("%d\n", strlen(&arr));//随机值 虽然&arr取出的是整个数组的地址,但是他任然是用第一个元素的地址来表示的,所以传过去后任然认为从第一个元素开始算
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//随机值

字符串数组里的\0是可以省略的,里面默认有\0
sizeof在计算字符串数组时,是要把\0和空格都计算在里面的,
strlen计算字符串数组时,计算空格,但是不计算\0,只计算\0之前的元素

char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7
	printf("%d\n", sizeof(arr + 0));//4
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr + 1));//4
	printf("%d\n", sizeof(&arr[0] + 1));//4
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//6
	//printf("%d\n", strlen(*arr));//非法
	//printf("%d\n", strlen(arr[1]));//非法
	printf("%d\n", strlen(&arr));//6
	printf("%d\n", strlen(&arr + 1));//已经跳出了这个字符串数组  随机值
	printf("%d\n", strlen(&arr[0] + 1));//5

在这里插入图片描述

char* p = "abcdef";
	printf("%d\n", sizeof(p));//4  p是一个指针变量
	printf("%d\n", sizeof(p + 1));// 4 相当于b的地址
	printf("%d\n", sizeof(*p));// *p就是a,a为char类型,所以大小为1
	printf("%d\n", sizeof(p[0]));//p[0]=*(p+0) 就是a,a为char类型,所以大小为1
	printf("%d\n", sizeof(&p));//是地址大小就是4
	printf("%d\n", sizeof(&p + 1));//&p后就和字符串没有关系了,就相当于把指针变量p的地址取出来放到一个指针里,然后再对这个指针+1,当然他也是一个地址,所以大小任然为4
	printf("%d\n", sizeof(&p[0] + 1));//相当于a的地址再+1  得到的是b的地址 大小4

	printf("%d\n", strlen(p));//6 p指向的是a的地址,所以从a的地址处开始计算
	printf("%d\n", strlen(p + 1));//5 从b的地址处开始计算
	printf("%d\n", strlen(*p));//*p=a  非法访问
	printf("%d\n", strlen(p[0])); //p[0] = *(p + 0)=a 非法访问
	printf("%d\n", strlen(&p));//p的地址在那我们并不清楚,所以从&p的地方开始算到底在哪里可以遇到\0也不清楚 所以是随机值
	printf("%d\n", strlen(&p + 1));//p的地址在那我们并不清楚,所以从+1的地方开始算到底在哪里可以遇到\0也不清楚。所以是随机值
	printf("%d\n", strlen(&p[0] + 1));//a的地址+1=b的地址,从b的地址算起为5

二维数组于指针的一些题

在这里插入图片描述

int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//sizeof(数组名)计算的是真个数组的大小:3*4*4=48
	printf("%d\n", sizeof(a[0][0]));//第一行第一列的那个元素,int类型 4字节
	printf("%d\n", sizeof(a[0]));// sizeof(a[0]), 就是求第一行的大小 16个字节
	printf("%d\n", sizeof(a[0] + 1));// 这里的a[0]就相当于第一行的首元素地址, + 1就是第一行第二个元素的地址,当然地址只能是4\8
	printf("%d\n", sizeof(*(a[0] + 1)));//4
	printf("%d\n", sizeof(a + 1));//sizeof(a+1),这里的a是二维数组首元素的地址,也就是第一行的地址,+1就是第二行的地址  4
	printf("%d\n", sizeof(*(a + 1)));//sizeof(*(a+1))就相当于是求第二行这个数组的总大小16
	printf("%d\n", sizeof(&a[0] + 1));//&a[0]取的是第一行数组的地址,+1就是第二行数组的地址  4
	printf("%d\n", sizeof(*(&a[0] + 1))); //就相当于是求第二行这个数组的总大小16
	printf("%d\n", sizeof(*a));//*第一行数组,16
	printf("%d\n", sizeof(a[3]));//行数到a[2]就没有了,但是sizeof计算时并不是要去找到那么数字带入计算而是通过类型来计算的,显然a[3]也是int a[4]类型的  16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注…

23.8.9总结

接下来是答辩后的完善: 轮播图在管理员处可以进行修改, 消息处用websocket实现实时更新, 管理员审核界面,未审核的文章不能点赞,评论,收藏,不能用前端页面, 评论用二级评论&…

(el-Table)操作:Element-plus 中Table 表格组件:多选修改成支持单选及表格相关样式的调整

Ⅰ、Element-plus 提供的 Table 表格组件与想要目标情况的对比: 1、Element-plus 提供 Table 组件情况: 其一、Element-ui 自提供的 Table 代码情况为(示例的代码): // Element-plus 自提供的代码: // 此时是使用了 ts 语言环境…

.NET根据类的值进行序列化反序列化操作

前言: 在.NET种,序列化一般常用的方式是使用Newtonsoft.Json进行序列化和反序列化操作,比如创建一个Person类 public class Person {public string Name { get; set; }public int Age { get; set; } }序列化为json // 对象序列化为 JSONPe…

vuejs 设计与实现 - 快速diff算法

Vue.js 2 所采用的双端 Diff 算法。既然快速 Diff 算法如此高效,我们有必要了解它的思路。接下来,我们就着重讨论快速 Diff 算法的实现原理。 相同的前置元素和后置元素 快速 Diff 算法借鉴了纯文本 Diff 算法中预处理的步骤。 案例: 旧的…

数据结构-队列(C语言的简单实现)

简介 队列也是一种数据结构,队列也可以用来存放数字每次只能向队列里将入一个数字,每次只能从队列里获得一个数字在队列中,允许插入的一段称为入队口,允许删除的一段称为出队口它的原则是先进先出(FIFO: first in first out)&…

Java8实战-总结15

Java8实战-总结15 引入流流简介流与集合 引入流 流简介 要讨论流,先来谈谈集合,这是最容易上手的方式。Java 8中的集合支持一个新的stream方法,它会返回一个流(接口定义在java.util.stream.Stream里)。在后面会看到,还有很多其他…

自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”

各位CSDN的uu们好呀,好久没有更新小雅兰的C专栏啦,话不多说,让我们进入类和对象的世界吧!!! 类的6个默认成员函数 构造函数 析构函数 拷贝构造函数 类的6个默认成员函数 如果一个类中什么成员都没有&am…

C 语言中,「.」与「->」有什么区别?

使用“.”的话,只需要声明一个结构体。格式是结构体类型名结构体名。然后通过结构体名加上“.”再加上域名,就可以引用结构体的域了。因为结构体的内存是自动分配的,就像使用int a;一样。而使用“->”的话,需要声明一个结构体的…

【三维编辑】Seal-3D:基于NeRF的交互式像素级编辑

文章目录 摘要一、引言二、方法2.1.基于nerf的编辑问题概述2.2.编辑指导生成2.3.即时预览的两阶段学生训练 三、实验总结 项目主页: https://windingwind.github.io/seal-3d/ 代码:https://github.com/windingwind/seal-3d/ 论文: https://arxiv.org/pdf/2307.15131…

vue3 动态导入src/page目录下的所有子文件,并自动注册所有页面组件

main.js添加一下代码: const importAll (modules) > {Object.keys(modules).forEach((key) > {const component key.replace(/src/, /).replace(.vue, );const componentName key.split(/).slice(-2, -1)[0] -page;app.component(componentName, modules…

Vue2-简介、模板语法、数据绑定、MVVM、数据代理、事件处理

🥔:成功之后就能光明正大地回望所有苦难 VUE-Day1 Vue简介1、Vue是什么?2、谁开发的? 发展历程?3、Vue的特点4、容器和实例、实例中的el和data总结 Vue模板语法插值语法指令语法 数据绑定1.单向数据绑定(v-…

SpringBoot入职学习

一、前言 公司入职,第一个事是把公司项目运行起来。然后在经过几天的颠沛流离,遇到一个事情。在创建yml文件的时候,需要设置自己的配置文件。当然还是先跑起来项目,就使用别人的yml文件。但是,到springboot配置那里卡…

视频抠像软件有哪些?简单好用视频抠像软件分享

在视频后期制作中,抠像通常用于将视频中的某个元素从其背景中分离出来。这种处理技术可以用于各种用途,比如创建特效、添加背景,或者将视频元素组合到新场景中。在电影、电视剧和广告等专业的影视制作中,抠像是一个常见的技术步骤…

cesium学习记录04-坐标系

一、地理坐标系和投影坐标系的关系 地理坐标系 (Geographic Coordinate System, GCS) 定义:地理坐标系是一个基于三维地球表面的坐标系统。它使用经度和纬度来表示地点的位置。 特点: 使用经纬度来定义位置。 基于特定的地球参考椭球体。 适用于全球范…

2023河南萌新联赛第(五)场:郑州轻工业大学 --亚托莉 -我挚爱的时光-

题目描述 亚托莉,-我挚爱的时光- 亚托莉自身机器可能有出了一点小故障,希望你能帮助她解决这个问题~ 亚托莉内部的操作系统的是 Linux 操作系统,不同于 Windows 操作系统。在大多数情况下, Linux 操作系统一般是通过…

死磕Android性能优化,卡顿原因与优化方案

随着移动互联网的快速发展,Android应用的性能优化变得尤为重要。卡顿是用户体验中最常见的问题之一,它会导致应用的响应变慢、界面不流畅,甚至影响用户的使用体验。因此,我们需要深入了解卡顿问题的原因,并寻找相应的解…

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言:本文主要介绍在企业使用Python搭建接口自动化测试框架,数据驱动读取excel表里的数据,和数据库方面的交互,包括关系型数据库Mysql和非关系型数据库MongDB,连接数据库,读取数据库中数据,最后…

刷题DAY18

题目一 LRU算法的实现 做一个key-value结构 假如说这个LRU的大小为3 那么就是当KEY-value没满的时候 直接顺序加入 当满了的时候 把最长时间没有使用的key-value替换掉 要求实现一个put 和 get行为 时间复杂度均为O(1) 用双向链表哈希表实现 哈希表可以用系统封装的双向链表…

node笔记——调用免费qq的smtp发送html格式邮箱

文章目录 ⭐前言⭐smtp授权码获取⭐nodemailer⭐postman验证接口⭐结束 ⭐前言 大家好,我是yma16,本文分享关于node调用免费qq的smtp发送邮箱。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_h…