我们今天讨论数组名是什么东西,理解它有助于我们进一步理解和使用指针。

因为它涉及到了内存地址。

问题

数组名是什么?含义是什么?

思路

前提

一个值+1之后的变化可以反映出它的意义/含义。

前提的证明

其实不证自明,计算机中就是这样的。

  • 生活中

    一个苹果+1,结果是两个,增加了一个苹果。

    一箱苹果+1,结果是两箱,个数是2*每箱苹果数,增加了一箱苹果。

  • 计算机中

    int型变量的地址+1,增加了一个int的大小。

    double型变量的地址+1,增加了一个double的大小。

思路

根据前提,通过将数组名或数组名相关的值+1来判断它的含义。

验证

编程中要了解一个东西,大多时候我们可以通过输出它来了解它。

代码

#include <iostream>
using namespace std; int main()
{
//注释指出array代表什么
int array[5] = { 1,2,3,4,5 };
printf(" &array[0] = %p\n", &array[0]); //首元素
printf(" array = %p\n", array); //数组
printf(" array+1 = %p\n", array + 1); //数组
printf(" &array[0]+1 = %p\n", &array[0] + 1); //首元素
printf(" &array = %p\n", &array); //数组
printf(" &array+1 = %p\n", &array + 1); //数组
printf("sizeof(array) = %zd\n", sizeof(array));//数组
}

为什么用printf不是cout?用cout其实也行,printf可能更方便,而且我忘了cout怎么控制位数了。

结果

    &array[0] =  0000002A433FF628
array = 0000002A433FF628
array+1 = 0000002A433FF62C
&array[0]+1 = 0000002A433FF62C
&array = 0000002A433FF628
&array+1 = 0000002A433FF63C
sizeof(array) = 20

结论

数组名是什么,有什么含义

数组名是一个常量(所以不能被赋值),是一个地址。(&array中array并不是地址,因为地址是一个值,我们并不能取一个值的地址吧)

在不同情况下,有着不同的含义。

  • 代表整个数组

    碰到&sizeof时,数组名代表整个数组,作用像是一个变量。

  • 代表数组首元素

    数组名单独出现或碰到[]*时,数组名代表数组第一个元素,是一个地址。(这个下次会讲)

知识点

IDE、编译器、编辑器

  • 编辑器

    文本编辑器,比如notepad++,sublime。

  • 编译器

    处理我们写的代码。

    C/C++的比如有:gcc,mingw。

    计算机语言可以分为两种:编译语言和解释语言。

  • IDE

    Integrated Development Environment,集成开发环境。

    集合了编辑器和编译器的功能,还有一些辅助开发的功能。

Visual Studio

  • 解决方案

  • 项目

  • 调试

  • 查看源码

    比如看sizeofiostreamCtrl+左键

  • 查看类图

    右击(项目)-查看-查看类图

十六进制

https://tool.lu/hexconvert/

地址+1

核心在于单位。见下篇

sizeof

占用的字节数。基本数据类型、结构体(会字节对齐)。

  • 不同环境下(32位、64位等)某种类型的变量占用字节数可能是不同的

    比如指针,32位下是4个字节,64位下是8个字节,

    正好是对应计算机的字长。(后边有讲计算机字长是什么)

  • %zdsize_t

后边还有一篇

%p %x

两者有细微差别。

重视warning

VS的warning还是比较全的,其他IDE的waring不一定全。

如果写代码出了问题却找不到原因,有可能是warning给出的潜在问题没有处理。

写代码时遇到waring一定要处理,不然很容易出问题。

混合编程

C和C++还是不一样的。特别是函数的使用,如果要动态申请一个类对象的内存,可别用malloc,它和new还是不一样的。

一些重要名词

生活、编程中出现的数字、字符串、字符等等,都是值。

比如1,2,3我爱你等等。

变量

变量算是对值的一个替代(或者说抽象)吧,提高复用性。

地址

地址是个值。

计算机有存储空间。我们将其一个个地编号,也就是给了它一个地址。

指针

指针是个变量。

跟普通变量其实没什么本质区别,只不过它被用来存储地址而已。

运算符优先级

* [] &的优先级?

计算机字长

字长:字的长度(位数)。

计算机中有字节这个单位。1个字节等于8位。

多个字节组成

我们平常说的电脑32位,64位指的就是字长。


作者:@臭咸鱼

本文为作者原创,转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!

C/C++小课之数组名是什么的更多相关文章

  1. 【C语言探索之旅】 第二部分第三课:数组

    内容简介 1.课程大纲 2.第二部分第三课: 数组 3.第二部分第四课预告:字符串 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语 ...

  2. C语言 数组名不是指针

    今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...

  3. C语言 数组名不是首地址指针

    今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...

  4. 云小课|MRS基础原理之MapReduce介绍

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:MapReduce ...

  5. C和指针 第六章 数组名与指针

    指针的算术运算符是指针和数组之间的一种关联,但不是唯一关联: 可以使用数组名作为指向数组第一个元素的指针,但是不可以给数组名赋新的值. //如下声明a int a[10]; //用a作为指向数组第一个 ...

  6. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...

  7. c语言 数组名是常量指针

    //数组名是常量指针 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include ...

  8. C语言的数组名和对数组名取地址

    http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...

  9. C/C++数组名与指针的区别详解

    1.数组名不是指针我们看下面的示例: #include <iostream> int main() { ]; char *pStr = str; cout << sizeof( ...

随机推荐

  1. 【POJ - 1703】Find them, Catch them(种类并查集)

    Find them, Catch them 直接翻译了 Descriptions 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人.该城有N个罪犯,编号从1至N(N<=100000. ...

  2. USACO 1.2 Broken Necklace

    断点是白色的情况在做题的时候完全没有想到呢... 看到了数据才发现这个问题$qwq$ /* ID:Starry21 LANG:C++ TASK:beads */ #include<iostrea ...

  3. 配置nginx直接使用webpack生成的gz压缩文件,而不用nginx自己压缩

    参考链接:https://blog.csdn.net/ywl570717586/article/details/100011721

  4. git 命令 git status add rm commit mv

    1.查看 git 仓库文件改动状态 Git 仓库内文件改动有 4 种状态,除了 Unmodified 状态的文件因为并未改动默认没有状态不做显示之外,其他文件改动状态都可以通过 git status ...

  5. P2709 小B的询问 【普通莫队】

    这是我的莫队入门题,我也了解到了莫队分为普通莫队以及带修莫队.顾名思义,普通莫队不需要修改区间的值,而带修莫队处理区间的值会修改的查询. 能用莫队的前提条件: 1.在知道 [l, r]中信息时,可以在 ...

  6. 非阻塞IO可以等同异步IO嘛?

    脑壳短路的一瞬间,黑人问号? 在这个问题之前,我们先了解下IO的过程,下图是异步IO,做个参照(图片随便找的,侵权联系小弟删除) 简单叙述下windows同步IO的流程(图片描述的是异步IO) 1.调 ...

  7. 基于freescale i.Mx6(ARM)的阿里云oss调试记录

    交叉编译阿里OSS调试记录 1.1 开通oss服务 具体参考以下链接: https://help.aliyun.com/document_detail/31884.html?spm=a2c4g.111 ...

  8. AirFlow功能展示个人笔记

    DAGs 查看您可以一目了然地查看成功.失败及当前正在运行的任务数量. 选中其中一个DAG 树视图 跨越时间的 DAG 的树表示.如果 pipeline(管道)延迟了,您可以很快地看到哪里出现了错误的 ...

  9. springBoot整合Listener

    新建项目 这个是pom文件 <properties> <java.version>1.8</java.version> </properties> &l ...

  10. vsphere6.7+Horizon7.8推送桌面遇到的一些问题

    系统环境 esxi6.7+vSphere6+Horizon7.8 VC环境为windows server 2016 standard 问题描述 vc安装 链接外部数据库找不到DSN 安装view co ...