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

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

问题

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

思路

前提

一个值+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. phpstudy批量getshell工具

    phpstudy批量getshell工具,最新phpstudygetshell,配合精确采集实现每天轻松上万! 详情可加QQ:1743685523

  2. Mac下使用sshpass让iterm2支持多ssh登录信息保存

    mac下没有xshell等连接linux服务器的工具,当需要管理的服务器越来越多之后,密码管理就成了一个很头疼的问题,每次都需要去复制粘贴密码,浪费了很多时间,在网上查了不少资料,发现mac下可以使用 ...

  3. LESSON 6- Quantization

    如果输入本身就是离散的(比如text, computer files…), 对于这种discrete sources不需要量化可以直接进行离散信源编码. 如果输入是waveform(比如声音),取样为 ...

  4. IDEA连接 Oracle数据库

    package com.zxx.util;import org.apache.commons.dbutils.DbUtils;import java.sql.Connection;import jav ...

  5. gRPC 本地服务搭建

    RPC RPC 原理 主流 RPC 框架 gRPC 概述 特点 服务端创建 定义服务 生成 gRPC 代码 服务端实现 客户端实现 踩坑记录 源码 RPC RPC 原理 RPC 框架的目标就是让远程服 ...

  6. SetIcon(m_hIcon, TRUE);的作用

    SetIcon(m_hIcon, FALSE);// Set small icon 这条语句,程序显示时,左上角就会显示定义了的图标,生成的EXE程序也显示了这个图标 SetIcon(m_hIcon, ...

  7. 【计算机网络】-网络层-Internet的网络层

    [计算机网络]-网络层-Internet的网络层 Internet是一组相互连接的网络或者自治系统的集合 Internet 1.存在几个主要骨干网络,骨干网络是由高带宽的线路和快速路由器构成 2.这些 ...

  8. 2019年十一月(CSP S游记及AFO)

    DAY-4 晚自习和班里以及搞OI的两个dalao商量了下决定停课了,当时觉得停得好晚,有的dalao都停一个月了.(现在感觉是明智的选择,我OI辣么菜还不如专注文化课) 晚上回家洗了个澡. DAY- ...

  9. 并不对劲的CF480E:Parking Lot

    题目大意 有一个\(n\times m\)的网格,每个位置是黑色或者白色.\(k\)个操作,每个操作是将一个白格子染黑,操作后输出当前最大的白色正方形的边长.\(n,m,k\leq 2\times 1 ...

  10. Visual Studio 2012网站如何只生成一个DLL文件

    简介: 在Visual Studio 2005,2008,2010版本中,都有Web Deployment工具将网站进行发布,所有代码文件和库文件发布,生成为一个动态链接库文件,而在Visual St ...