C语言——深入理解指针(四)

C语言——深入理解指针(四)

数组名的意义

  • sizeof(数组名),且数组名单独放在sizeof内部,则这里的数组名表示整个数组,计算的是整个数组的大小
  • &数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址
  • 除此之外所有的数组名都表示首元素的地址

sizeof和strlen的比较

1.sizeof是操作符,用于计算变量所占内存大小(不关注内存中存放什么数据),单位是字节
在这里插入图片描述
2.strlen是库函数(需要包含头文件<string.h>),求字符串长度。其统计的是从strlen函数的参数str中这个地址开始向后,\0之前字符串中字符的个数。函数原型:

size_t strlen (const char* str)//返回类型注意为size_t

在这里插入图片描述
但若没有\0,就可能会存在越界查找,结果就是一个随机数,如下图所示:
在这里插入图片描述
3.比较
在这里插入图片描述

实例:

(一)一维数组

这里千万要注意前面提到的数组名的意义

#include<stdio.h>
int main()
{int a[] = { 1,2,3,4 };
printf("%zu\n", sizeof(a));//16
//a单独在sizeof里面代表整个数组,即四个元素乘以它们的类型所占字节
printf("%zu\n", sizeof(a+0));//4/8
//a没有单独在里面,所以代表首元素的地址,那么a+0还是首元素的地址,这里计算的是一个地址的大小不同环境有差别
printf("%zu\n", sizeof(*a));//4
//这里a没有单独放在sizeof内,a就是首元素地址,*a就是首元素1
printf("%zu\n", sizeof(a+1));//4/8
//a是首元素的地址,a+1就是第二个元素的地址
printf("%zu\n", sizeof(a[1]));//4
//第二个元素
printf("%zu\n", sizeof(&a));//4/8
//&a取出的是数组的地址,数组的地址也是地址
printf("%zu\n", sizeof(*&a));//16
//&a取出的是数组的地址,它的类型为int(*)[4]
//对于数组指针解引用,访问的则是这个数组
printf("%zu\n", sizeof(&a+1));//4/8
//&a是数组的地址,&a+1是跳过数组后的地址
printf("%zu\n", sizeof(&a[0]));//4/8
//第一个元素的地址
printf("%zu\n", sizeof(&a[0]+1));//4/8
//跳过第一个元素的地址,到达第二个元素的地址
return 0;
}

运行结果:
在这里插入图片描述

(二)字符数组

(1)操作符sizeof

#include<stdio.h>
int main()
{char arr[] = { 'a','b','c','d','e','f'};printf("%zu\n", sizeof(arr));//6,计算整个数组printf("%zu\n", sizeof(arr + 0));//4/8,首元素的地址printf("%zu\n", sizeof(*arr));//1,*arr就是首元素printf("%zu\n", sizeof(arr[1]));//1,第二个元素printf("%zu\n", sizeof(&arr));//4/8,数组的地址printf("%zu\n", sizeof(&arr + 1));//4/8,依旧是地址printf("%zu\n", sizeof(&arr[0] + 1));//4/8,第二个元素的地址return 0;
}

运行结果:
在这里插入图片描述

#include<stdio.h>
int main()
{char* p = "abcdef";printf("%zu\n", sizeof(p));//4/8//p是一个指针变量,我们假设地址0x0012ff30printf("%zu\n", sizeof(p + 0));//4/8//p+1就是b的地址printf("%zu\n", sizeof(*p));//1//char*类型指针解引用只能访问一个字符printf("%zu\n", sizeof(p[0]));//1//p[0]->*(p+0)->*p,就是第一个元素printf("%zu\n", sizeof(&p));//4/8//&p是指针变量p的地址,是二级指针printf("%zu\n", sizeof(&p+ 1));//4/8printf("%zu\n", sizeof(&p[0] + 1));//4/8//&p[0]+1就是b的地址return 0;
}

在这里插入图片描述
在这里插入图片描述
(2)库函数strlen():

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%zu\n", strlen(arr));//随机值//arr是数组首元素地址,strlen算的是整个数组,由于字符串中找不到\0,所以为随机值printf("%zu\n", strlen(arr + 0));//随机值//(arr+0)也是首元素地址printf("%zu\n", strlen(*arr));//程序崩溃//arr是首元素地址,*arr就是首元素即‘a’——97//这里就会出现非法访问内存printf("%zu\n", strlen(arr[1]));//程序崩溃//同上printf("%zu\n", strlen(&arr));//随机值//整个数组的地址,从数组的起始位置数字符串的长度,但是没有\0printf("%zu\n", strlen(&arr + 1));//随机值//跳过这个数组的地址,向后找\0printf("%zu\n", strlen(&arr[0] + 1));//随机值//从第二个元素的地址,向后找\0return 0;
}
int main()
{char* p = "abcdef";printf("%zu\n", strlen(p));//6//p就是a的地址,直至遇到\0向后数有6个字符printf("%zu\n", strlen(p+1));//5//p+1指向b,向后数直到遇到\0有五个字符printf("%zu\n", strlen(*p));//error//*p就是第一个字符printf("%zu\n", strlen(p[0]));//error//同上printf("%zu\n", strlen(&p));//随机值//p变量在内存中后续的空间内容不确定printf("%zu\n", strlen(&p+1));//随机值//同上printf("%zu\n", strlen(&p[0]+1));//5//&p[0]就是a的地址,&p[0]+1就是b的地址,从b的位置向后数return 0;
}

(三)二维数组

  • 这里还是要特别注意:数组名单独放在sizeof内,表示整个数组
  • 还要注意的一个点:sizeof在计算变量,数组的大小时,是通过类型来推导的,不会真实去访问内存,举个栗子:

在下图中,括号内s=a+2,其中a和2都是int类型,算出来s=12,但sizeof并不会去计算,而是看s本身是什么类型,short类型占两个字节,所以打印出来的仍是2而不是4;而打印s的值时,也不会因为在sizeof里面的算式而改变。

在这里插入图片描述

  • 实例
#include<stdio.h>
int main()
{int a[3][4] = { 0 };printf("%zu\n", sizeof(a));//48printf("%zu\n", sizeof(a[0][0]));//4printf("%zu\n", sizeof(a[0]));//16//a[0]是第一行一维数组名,单独放在sizeof内部// 表示第一行这个数组printf("%zu\n", sizeof(a[0]+1));//4/8//a[0]没有单独放在sizeof中// 则a[0]是第一行第一个元素的地址,a[0]+1是第一行第二个元素的地址printf("%zu\n", sizeof(*(a[0] + 1)));//4//*(a[0] + 1)是第一行第二个元素printf("%zu\n", sizeof(a+1));//4/8//a未单独放在sizeof中,表示数组首元素的地址,就是第一行的地址// a+1就是第二行的地址printf("%zu\n", sizeof(*(a+1)));//16//a+1是第二行的地址,解引用就是a[1]这行数组,计算的是整个数组的大小printf("%zu\n", sizeof(&a[0]+1));//4/8//表示第二行的地址printf("%zu\n", sizeof(*( & a[0] + 1)));//16//第二行的地址解引用就是这一行printf("%zu\n", sizeof(*a));//16//a没有单独放在里面,是第一行的地址,解引用就是a[0]printf("%zu\n", sizeof(a[3]));//16//sizeof在计算变量,数组的大小时,是通过类型来推导的,不会真实去访问内存//所以这里不会有越界访问return 0;
}

在这里插入图片描述
我们来测试一下运行结果:
在这里插入图片描述

本次内容到这里就结束了,谢谢观看,如有不对欢迎在评论区留言指正。
心向往之行必能至!

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

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

相关文章

LeetCode 刷题【42. 接雨水】

42. 接雨水 自己做 解&#xff1a;双指针左右分割容器 class Solution { public:int trap(vector<int>& height) {int res 0;int len height.size();if(len < 2) //构不成一个容器了&#xff0c;直接返回return res;int end len - 1; //右边界int…

网络的基本概念、通信原理以及网络安全问题

目录 1、 什么是网络&#xff1f; &#xff08;1&#xff09;网络的概念与本质 &#xff08;2&#xff09;电压信号的合并与抵消 &#xff08;3&#xff09;电压的本质 2、中转设备 &#xff08;1&#xff09;背景 &#xff08;2&#xff09;中转设备的处理能力与编程能…

Windows下使用WSL2创建Ubuntu子系统(更改安装位置与启动图形桌面)

Windows下使用WSL2创建Ubuntu子系统&#xff08;更改安装位置与启动图形桌面&#xff09; 本文介绍如何使用WSL2创建Ubuntu子系统&#xff0c;并更改安装位置到其他磁盘&#xff0c;并启动图形桌面Xfce4。 WSL 版本: 2.5.7.0 系统版本: Windows11 23H2 相关工具&#xff1a;Mo…

时间泄漏 TemporalLeakage

时间泄漏 TemporalLeakage: 就是后续有事件发生&#xff0c;然后才有了这个结果&#xff0c;但是在该事件发生之前&#xff0c;不应该预测该结果。 Temporal Leakage 问题是往往导致纵向Planning不“果断”。 解决方案&#xff1a;人工标注出时间发生的时刻 真值只监督时间发生…

独立书店数字化转型:绝版书修复档案系统与读者阅读行为分析营销平台

在电商冲击与阅读习惯变迁的双重压力下&#xff0c;独立书店正遭遇 “旧书修复难、新书卖不动” 的生存困境。传统模式中&#xff0c;绝版书修复依赖老师傅经验&#xff0c;单本修复周期长达 2 周&#xff0c;损耗率超 30%&#xff1b;营销缺乏数据支撑&#xff0c;导致客流年均…

const修饰指针用法详解

目录 一、const修饰变量 绕过const限制的问题 二、const修饰指针变量 1、无const修饰的指针 2、const放在*左边 3、const放在*右边 4、*两边都有const 三、使用建议 四、记忆技巧 一、const修饰变量 在C语言中&#xff0c;变量默认是可修改的。如果我们希望某个变量不能…

pcl法线估计的踩坑

1&#xff0c;normalestimation对点云法线的评估&#xff0c;只输出法线向量&#xff0c;并不输出xyz值。如果输出类型是pointnormal&#xff0c;那么这点云的法向量有值&#xff0c;xyz值都是02&#xff0c;添加点云xyz数据。可以使用 pcl::concatenatefields(*a,*b,*c)函数p…

利用Minicsv库解析csv文件的c程序及读入测试

上午的c程序写入xlsx较快但不正确&#xff0c;python程序虽正确但过慢。所以找了一个全部源程序加起来不到4K字节的C语言csv解析库Minicsv&#xff0c;来改写&#xff0c;改写结果如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h…

企微用户部门同步HRS系统

企微用户导入HR系统流程说明 概述 本文档详细说明了WechatUserImportServiceImpl.importWechatUsersToHrs()方法的业务流程和实现逻辑。该方法负责将企业微信用户数据同步导入到HR管理系统中&#xff0c;包括员工信息、工作信息和任职记录的创建与更新。 主要功能 数据同步…

告别传统SEO!拥抱下一代流量密码:生成式引擎优化(GEO)实战指南

前言&#xff1a;为什么你的“最佳实践”SEO正在失效&#xff1f;你是否发现&#xff0c;即使严格遵循了谷歌自2019年以来的所有“最佳实践”&#xff0c;你的技术博客或产品文档的流量依旧增长乏力&#xff0c;甚至不升反降&#xff1f;你不是一个人。问题在于&#xff0c;游戏…

week1-[一维数组]传送

week1-[一维数组]传送 题目描述 有 nnn 个传送门&#xff0c;从第 iii 个传送门进去后会被传送到第 aia_iai​ 个传送门&#xff0c;进而被传送到第 aaia_{a_i}aai​​ 个传送门&#xff0c;如此一直下去……小 A 想知道从第 kkk 个传送门进去后&#xff0c;能不能回到第 kkk 个…

【18】目心智能——目心智能 嵌入式一面 ,校招,面试问答记录

目心智能——目心智能 嵌入式一面 &#xff0c;校招&#xff0c;面试问答记录 1 简单自我介绍2 你做了这么多算法&#xff0c;为什么不找算法的&#xff1f;3 我们主要还是软件开发&#xff0c;不做结构设计4 模电知识6 CSDN应该附链接在简历上&#xff0c;稍后发给我&#xff…

C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏

快递运费计算器帮一家快递站点开发一个快递运费计算器&#xff0c;快递站点人员只需要输入包裹重量和地点编号即可计算出对应的运费。假设快递费计算规则如下&#xff1a;首重&#xff1a;3公斤 3公斤以内&#xff1a;1.东三省/宁夏/青海/海南&#xff1a;12元&#xff0c;2.新…

网络安全蓝队常用工具全景与实战指南

摘要 在现代信息系统的安全防护中&#xff0c;蓝队承担着防御、检测、响应和持续改进的核心职责。要实现高效、可持续的防御能力&#xff0c;蓝队需要一整套成熟、可靠的工具集来进行威胁情报收集、日志分析、入侵检测、漏洞评估、端点防护、网络流量监控、事件响应与取证等工作…

基于 Flink 的淘宝实时数据管道设计:商品详情流式处理与异构存储

引言在电子商务领域&#xff0c;实时数据处理能力已成为企业核心竞争力的重要组成部分。淘宝作为中国领先的电商平台&#xff0c;每天产生海量的商品数据&#xff0c;这些数据需要被实时处理、分析并分发到各种存储系统中&#xff0c;以支持搜索、推荐、库存管理等关键业务。本…

面试题:【多线程问题,三个线程A,B,C;C线程依赖B线程的结果执行,怎么控制】

在 Java 中&#xff0c;若需要控制线程间的依赖关系&#xff08;如 C 线程依赖 B 线程的结果&#xff09;&#xff0c;可以通过以下几种方式实现&#xff1a; 方案 1&#xff1a;使用 CountDownLatch CountDownLatch 是一个同步工具类&#xff0c;允许一个或多个线程等待其他线…

React useMemo 深度指南:原理、误区、实战与 2025 最佳实践

把“为什么用、怎么用、用错了怎么办”一次讲透&#xff0c;附 React 19 自动优化前瞻。一、useMemo 是什么&#xff1f; 一句话&#xff1a; useMemo 记住&#xff08;缓存&#xff09;昂贵计算结果&#xff0c;只在依赖变化时重新计算。 const memoValue useMemo(() > {…

[ HTML 前端 ] 语法介绍和HBuilderX安装

目录 一. HTML 1.概述 2. 安装前端开发工具 (1)HBuilderX下载 (2)创建html项目和使用 3. HTML基础 1.标签 (1).标签定义: (2).标签结构: (3).标签属性: 2.常用标签: 3.特殊符号: 4.表格(table) (1)基本标签: (2)基本结构: (3)表格属性: 5.表单(form) (1). 表单概述…

Spring Cloud系列—Alibaba Sentinel熔断降级

上篇文章&#xff1a; Spring Cloud系列— Alibaba Sentinel限流https://blog.csdn.net/sniper_fandc/article/details/149944260?fromshareblogdetail&sharetypeblogdetail&sharerId149944260&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link…

Spring Boot 使用 @NotBlank + @Validated 优雅校验参数

在日常开发中&#xff0c;我们常用 if (isBlank(...)) 来判断参数是否为空&#xff0c;但这种方式不仅繁琐&#xff0c;而且容易遗漏。 Spring 生态中推荐使用 JSR-303 校验注解&#xff08;NotBlank、NotNull 等&#xff09;配合 Validated 实现自动校验&#xff0c;大幅减少手…