C/C++小课之数组名

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

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

问题

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

思路

前提

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

前提的证明

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

  • 生活中

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

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

  • 计算机中

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

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

思路

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

验证

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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怎么控制位数了。

结果

1
2
3
4
5
6
7
    &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://chouxianyu.github.io

欢迎讨论和交流!