C语言数组进阶-数组名的理解和计算

在之前我们关于数组的内容中,我们已经提出了关于数组名的理解

一般情况下,数组名是数组首元素的地址,但有两个例外:

1.sizeof(数组名)是计算整个数组的大小 2.&数组名是取出的整个数组的地址

sizeof不管后面是啥,只判断这个东西的长度

整型数组

现在给出我们这样的一个数组,然我们进行相关的判断

int a[] = { 1,2,3,4 };
	printf("%zd\n", sizeof(a));        //1printf("%zd\n", sizeof(a + 0));    //2printf("%zd\n", sizeof(*a));        //3printf("%zd\n", sizeof(a + 1));      //4printf("%zd\n", sizeof(a[1]));    //5printf("%zd\n", sizeof(&a));        //6printf("%zd\n", sizeof(*&a));        //7printf("%zd\n", sizeof(&a + 1));       //8printf("%zd\n", sizeof(&a[0]));    //9printf("%zd\n", sizeof(&a[0] + 1));        //10

式子一:sizeof+数组,整个数组的长度,单位是字节,因此是4 * 4 = 16

式子二:并不是sizeof中只有数组,因此此时是数组首元素的地址,+0还是首元素的地址,地址的字节是4/8

式子三:a是首元素地址,*a是首元素,大小4

式子四:第二个元素的地址,4/8

式子五:a[1]是第二个元素,4

式子六:取出的是数组的地址,4/8

式子七:取出了数组的地址,解引用后是整个数组a,因此是16

式子八:取出整个数组的地址,跳过这个数组后的地址,4/8

式子九:取出首元素的地址,4/8

式子十:取出第二个元素的地址,4/8

字符串数组(一)

	char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));    //1printf("%d\n", sizeof(arr + 0));       //2printf("%d\n", sizeof(*arr));    //3printf("%d\n", sizeof(arr[1]));    //4printf("%d\n", sizeof(&arr));    //5printf("%d\n", sizeof(&arr + 1));    //6printf("%d\n", sizeof(&arr[0] + 1));    //7

这个数组只有六个元素

式子一:整个数组的长度,1 * 6 = 6

式子二:第一个元素的地址,4/8

式子三:arr是一个元素的地址,*arr是第一个元素,是char类型,1

式子四:第二个元素,1

式子五:取出整个数组的地址,地址的大小是4/8

式子六:取出整个数组的地址,跳过了一个数组,4/8

式子七:取出第二个元素的地址,4/8

那么,对于strlen呢?

strlen是判断字符串长度的,是从括号里的地址开始,直到\0位置为止

	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));    //1printf("%d\n", strlen(arr + 0));     //2printf("%d\n", strlen(*arr));    //3printf("%d\n", strlen(arr[1]));    //4printf("%d\n", strlen(&arr));    //5printf("%d\n", strlen(&arr + 1));    //6printf("%d\n", strlen(&arr[0] + 1));    //7

式子一:arr代表数组首元素的地址,由于无\0,故是随机值

式子二:数组首元素的地址,随机值

式子三:数组的首元素,'a'- -> 97,相当于取97地址,err,读取位置访问冲突,报错

式子四:数组的第二个元素,'b'-->98,err

式子五:取出整个数组的地址,数组的地址就是首元素的地址,随机值

式子六:跳过一个数组以后的地址,随机值

式子七:从第二个元素的地址开始,随机值

那么对于另一种字符串数组呢?

字符串数组(二)

char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));    //1printf("%d\n", sizeof(arr + 0));        //2printf("%d\n", sizeof(*arr));    //3printf("%d\n", sizeof(&arr));    //4printf("%d\n", sizeof(&arr+1));    //5printf("%d\n", sizeof(&arr[0]+1));    //6

式子一:计算数组的长度,不要忘记隐藏的\0,7

式子二:数组首元素的地址,大小4/8

式子三:arr是数组的首元素地址,*arr是数组的首元素,char类型,1

式子四:取出整个数组的地址,大小4/8

式子五:跳过一个数组后的地址,4/8

式子六:第二个元素的地址,4/8


char arr[] = "abcdef";
printf("%d\n", strlen(arr));    //1
printf("%d\n", strlen(arr+0));        //2
printf("%d\n", strlen(*arr));    //3
printf("%d\n", strlen(arr[1]));        //4
printf("%d\n", strlen(&arr));    //5
printf("%d\n", strlen(&arr+1));    //6
printf("%d\n", strlen(&arr[0]+1));        //7

式子一:长度为6

式子二:首元素的地址,向后数,也是6

式子三:*arr代表首元素,'a'-->97,err

式子四:数组的第二个元素,'b'-->98,err

式子五:取出arr的地址,6

式子六:跳过一个数组后的地址,随机值

式子七:从第二个元素开始的地址,计算5

字符串数组(三)

char* p = "abcdef"; 
printf("%d\n", sizeof(p));//p是指针变量,计算的指针变量的大小,4/8字节
printf("%d\n", sizeof(p + 1));//'b'的地址,4/8
printf("%d\n", sizeof(*p));//p的类型是char*,*p是char,a,1
printf("%d\n", sizeof(p[0]));//p[0]-->*(p+0)-->*p-->'a',1
printf("%d\n", sizeof(&p));//取出的是p的地址,4/8
printf("%d\n", sizeof(&p + 1));//跳过p指针变量后的地址,是4/8
printf("%d\n", sizeof(&p[0] + 1));//第二个元素的地址

式子一:p是指针变量,计算指针变量的大小,4/8

式子二:'b'的地址,4/8

式子三:p是指针,*p是a,大小1

式子四:a,大小是1

式子五:p是指针,&p是二级指针,也是指针,4/8

式子六:跳过p后的地址,4/8

式子七:第二个元素的地址

char* p = "abcdef";
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p + 1));//5
printf("%d\n", strlen(*p));//97,err
printf("%d\n", strlen(p[0]));//err
printf("%d\n", strlen(&p));//&p是指针变量p的地址,与字符串"abcdef"关系不大
//从p这个指针变量起始位置开始数的,p的地址是什么不知道,随机值
printf("%d\n", strlen(&p + 1));//随机值
printf("%d\n", strlen(&p[0] + 1));//5

式子一:p是指针变量,指向a的位置,6

式子二:指向b,5

式子三:*p是字符a-->97,err

式子四:也是字符a

式子五:二级指针,不清楚大小,随机值

式子六:二级指针后跳过p,随机值

式子七:从第二个元素地址开始计算,5

二维数组

int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//a是数组名,单独放在sizeof内部,计算数组大小48
printf("%d\n", sizeof(a[0][0]));//第一行的第一个元素,4个字节
printf("%d\n", sizeof(a[0]));//第一行的数组名,数组名单独放在sizeof,计算数组大小,16
printf("%d\n", sizeof(a[0] + 1));//a[0]并没有单独放在内部,这里的a[0]是数组的首元素地址//等价于&a[0][0],+1后是a[0][1]的地址,4/8
printf("%d\n", sizeof(*(a[0] + 1)));//第一行第二个元素,4
printf("%d\n", sizeof(a + 1));//a作为数组没有单独放在内部,a表示数组首元素地址//二维数组首元素的地址就是第一行的地址,跳过一行指向第二行//a+1是数组指针,指针大小4/8	
printf("%d\n", sizeof(*(a + 1)));//*(a + 1)代表第二行 - 16//*(a + 1) == a[1],是第二行的数组名
printf("%d\n", sizeof(&a[0] + 1));//a[0]是第一行数组名,&a[0]第一行的地址,//+1,跳过第一行,第二行的地址,4/8个字节
printf("%d\n", sizeof(*(&a[0] + 1)));//第二行,*(&a[0] + 1) == *(a + 1),16
printf("%d\n", sizeof(*a));//a代表第一行的地址,*a代表第一行,16
printf("%d\n", sizeof(a[3]));//a[3]无需真实访问,仅仅通过类型的推断就能算出长度//a[3]是第四行的数组名,大小单独放在sizeof内部,计算第四行的大小,16

式子一:计算整个数组的大小 4 * 12

式子二:计算第一行首元素,int类型,4

式子三:a[0]代表第一行,可以理解为一维数组,大小是16

式子四:a[0]代表的是地址,+1后也是地址,4/8

式子五:第一行第二个元素,4

式子六:第二行的地址,4/8

式子七:第二行,4 * 4 = 16

式子八:第二行的地址,4/8

式子九:第二行,16

式子十:第一行,16

式子十一:被认为了第四行,尽管没有,但不会实际运算,只会根据他的类型 int [4]判断出这一行可能是4个元素,大小是16

感谢您的观看

总结

sizeof + 地址 = 4/8

strlen一般来说只能加地址

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

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

相关文章

谷粒学院--在线教育实战项目【一】

谷粒学院--在线教育实战项目【一】 一、项目概述1.1.项目来源1.2.功能简介1.3.技术架构 二、Mybatis-Plus概述2.1.简介2.2.特性 三、Mybatis-Plus入门3.1.创建数据库3.2.创建 User 表3.3.初始化一个SpringBoot工程3.4.在Pom文件中引入SpringBoot和Mybatis-Plus相关依赖3.5.第一…

融资项目——OpenFeign的降级与熔断

当一个微服务调用其他微服务时,如果被调用的微服务因各种原因无法在规定时间内提供服务,则可以直接使用本地的服务作为备选,即进行降级熔断。 如之前所提到的微服务为例: 如果希望实现降级熔断,可以在本地创建一个实现…

探索vue框架的世界: 内部、外部样式和内联样式动态绑定的方法

在实际项目中,经常会遇到这样的场景,可以通过逻辑层中设定的变量,在视图层中来呈现不同的样式,那么这种动态绑定样式的方式如何实现呢? 本篇文章,博主将和大家分享动态绑定内联样式style 和 动态绑定内部和…

AI改变游戏规则:内容创作的新时代!

AI技术,尤其是人工智能(AI)在内容创作领域的应用,正开启了一个全新的时代。这一时代的核心在于利用AI的能力,不仅提高内容创作的效率,还能引入前所未有的创新元素,从而彻底改变游戏规则。 AI在…

OpenCV与AI深度学习 | 基于OpenCV实现模糊检测 / 自动对焦

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:基于OpenCV实现模糊检测 / 自动对焦 导 读 本文主要介绍使用OpenCV实现图像模糊检测/相机自动对焦功能。 前 言 为了检测图片是否对焦&…

coqui-ai/TTS 案例model文件

GitHub - coqui-ai/TTS: 🐸💬 - a deep learning toolkit for Text-to-Speech, battle-tested in research and production Coqui AI的TTS是一款开源深度学习文本转语音工具,以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&…

C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码

David A. Huffman 1 哈夫曼编码简史(Huffman code) 1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是…

java编程的简化表达方法——Lambda表达式及方法引用概述

前言: 学到简化写法了,感觉需要对代码非常熟悉才能用得好,整理下写法。打好基础,daydayup! Lambda表达式 Lambda表达式是JDK8开始新增得一种语法形式;作用:用于简化匿名内部类的代码写法。 Lambda表达式的格…

CPU处理器模式与异常

ARM架构中的Exception Level(EL) 在ARM架构中,Exception Level(EL)是一个关键概念,它表示了处理器当前处理异常或中断的层次。ARMv8-A架构定义了四个Exception Levels:EL0、EL1、EL2和EL3&…

蓝桥杯嵌入式模板构建——RCT时钟

在CubeMX里的RTC模块启用RTC时钟和日历功能 输入到RTC的时钟要配置成1HZ,这样的话RTC每经过1s走时一次 由于RTC时钟默认配置为32Khz 所以我们需要将异步分频值与同步分频值的乘积调整为32K分频即可一秒走时一次 频率:32000hz / 32000hz 1hz 必须是31和999&#…

程序员的最佳副业居然是这个

程序员的副业思考 从 2008 年开始接触编程,已经在程序开发领域摸爬滚打 16 年。期间呆过私企,国企,外企,500 强,打过杂,创过业,干过核心开发,也搞过代码测试。总结起来就是四个字&a…

阿珊详解Vue路由的两种模式:hash模式与history模式

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于SpringBoot的在线拍卖系统设计与实现(源码)

项目源码:https://gitee.com/oklongmm/biye2 引言 随着互联网技术的发展,电子商务得以快速发展,其中之一的在线拍卖系统也逐渐得到了广泛的应用。但是,现有的在线拍卖系统在操作复杂性、安全性和稳定性方面存在一定的问题。为了…

计算机网络面经-HTTPS加密过程

前言 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流程,但总感觉少了点什么,应该是少了对安全层的针对性介绍,那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。 HTTPS 和 HTTP的区别 显然&am…

idea Gradle 控制台中文乱码

如下图所示,idea 中的 Gradle 控制台中文乱码: 解决方法,如下图所示: 注意:如果你的 idea 使用 crack 等方式破解了,那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…

AcWing 106. 动态中位数

#include<bits/stdc.h>using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--){//num 表示编号&#xff0c;n 表示数字的数目&#xff0c;题目保证//n 是奇数int num,n;cin>>num>>n;//输出编号&#…

Java引用传递及基本应用

在 Java 中&#xff0c;传递参数的方式主要有两种&#xff1a;值传递&#xff08;传递的是对象的引用值&#xff09;和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中&#xff0c;所有的方法参数都是通过值传递的。对于对象类型的…

从零学算法41

41.给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;nums […

【LeetCode-中等】18.四数之和 - 哈希/双指针

力扣题目链接 题目要求在 nums 数组里找到四个下标不同&#xff08;值可以相同&#xff09;的数&#xff0c;使得nums[a] nums[b] nums[c] nums[d] target&#xff0c;同时&#xff0c;还要求四元组不能重复&#xff08;{0, 1, 2, -2} 和 {-2, 0, 1, 2} 为同一个四元组&am…

MAC 的vscode菜单栏怎么调?

我去&#xff0c;这个bug找到了半天&#xff0c;终于找到正解了&#xff0c;仅记录&#xff0c;为广大和我一样不熟悉mac的兄弟们避坑。 正解&#xff1a;mac的vscode的菜单栏在屏幕最顶上&#xff0c;不用调出来&#xff0c;人家一直都有。