数组名和指针的区别

一、数组名代表什么
二、数组名同指针区别
三、使用数组名的其它含义

一、数组名代表什么
考虑如下声明:

int a;
int b[10];

我们将变量a成为标量,因为它是一个单一的值,而这个变量的类型为一个整型(int),
而变量b我们称为一个数组,因为它是一些值的集合。下标和数组名一起使用,可用于标
识该集合中某个特定的值。

如b[0]表示的是数组b的第一个元素的值,b[4]表示第5个值,每个特定值都是一个量。
b[4]的类型是整型,那b的类型是什么?以及b 表示的又是什么?

既然b[0],b[1],b[2],b[3],b[4]代表的是单个的元素,那么b代表的不就整个数组吗?
但事实并非如此,在C中,几乎所有使用数组名的表达式中,数组名的值是一个指
针常量,也就是数组名是一个指向数组第一个元素的地址的指针常量

并取决于数组元素的类型:如果为int类型,那么数组名的类型就是“指向int的常量 指针”;
如果数组名的类型是其他类型,那么数组名的类型就是“指向其他类型的常量指针”

那么数组名的值是一个指针常量,那么数组指针岂不是相同的?

很显然,并不是,因为数组具有一些和指针完全不同的特征。例如:数组具有确定数量
的元素,而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达
式中使用时,编译器才会为其产生一个指针常量。

二、数组名同指针区别

为了说明指针和数组并不是相等的,考虑如下声明:

int a[5];
int *b;

a和b能够互换使用吗?他们都具有指针价值,而且都可以进行间接访问和下标引用访问操
作。但是,他们还是存在相当大的区别。

声明一个数组时,编译器将根据声明所指定的元素保留内存空间,然后再创建数组名,它
的值是一个常量,指向这段空间的起始位置(首元素的地址)。

声明一个指针时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。
此外,指针变量并未被初始化为指向任何现有的内存空间,如果它不是一个自动变量,它甚至
根本不会被初始化。把这两个声明用图的方法来表示,可以发现它们之间存在显著不同。
数组名和指针的区别
ps:此时的b为野指针

三、使用数组名的其它含义

数组名在一般情况下使用时都是代表首元素地址,但在以下两种情况是其他含义:
1.&(数组名),该情况是产生一个指向数组的指针。
2.sizeof(数组名),该情况返回整个数组的长度。

原文链接:https://www.cnblogs.com/zzao/p/17166152.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数组名和指针的区别 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Java中异常处理之try和catch代码块的使用

    针对“Java中异常处理之try和catch代码块的使用”,这里提供一些完整的攻略和示例: 异常处理的概念 在编写Java程序时,可能会出现一些异常情况,例如:输入的数据格式不正确、文件不存在等。异常指程序运行时发生了一些不易处理的错误情况,这些错误情况常常导致程序无法正常运行,也可能导致程序崩溃。为了保证程序的稳定性,Java提供了异常处理机制,让程序在出…

    C 2023年5月23日
    00
  • 电脑无法启动并提示0xc000000e怎么办

    电脑无法启动并提示0xc000000e的解决方法 问题描述 当电脑启动时,可能会出现以下错误信息: Windows Failed to start. A recent hardware or software change might be the cause. To fix the problem: 1. Insert your Windows insta…

    C 2023年5月23日
    00
  • 关于C语言中数据在内存中的存储详解

    关于C语言中数据在内存中的存储详解 C语言是一种底层语言,它的代码直接被编译为机器语言,而在C语言中,数据的存储方式非常重要,因为它将直接影响程序的性能和可靠性。 数据类型的存储方式 在C语言中,不同的数据类型会占用不同的内存空间,通常来说,一个字节(byte)等于八个位(bit)。下面是一些常见数据类型占用的内存空间。 char: 一个字节 short: …

    C 2023年5月23日
    00
  • 详解C语言实现推箱子的基本功能

    详解C语言实现推箱子的基本功能 推箱子是一款经典的益智游戏,它在C语言中的实现,可以帮助我们加深对基本数据结构和算法的理解。本文将详细讲解如何在C语言中实现推箱子的基本功能。 第一步:初始化游戏地图 首先,我们需要定义一个游戏地图。游戏地图是由若干行和列组成的二维数组。其中,数字0表示空地,数字1表示障碍物,数字2表示目标点,数字3表示箱子,数字4表示玩家。…

    C 2023年5月23日
    00
  • C++算法计时器的实现示例

    C++算法计时器可以用来衡量代码运行时间的精度,这对于优化算法的效率非常重要。下面就来详细讲解C++算法计时器的实现示例。 设计思路 需要用到两个库:chrono和iostream。具体实现的步骤如下: 使用auto关键字声明两个时间点变量:start和end。 将程序代码放在start和end之间,即需要计时的部分。 使用std::chrono::dura…

    C 2023年5月23日
    00
  • C语言实现UDP通信

    下面是C语言实现UDP通信的完整攻略。 1. 确定需要使用的库和头文件 首先需要引入的头文件有: #include <stdio.h> //标准输入输出库 #include <stdlib.h> //标准库 #include <string.h> //字符串处理库 #include <unistd.h> //U…

    C 2023年5月23日
    00
  • C指针原理教程之C快速入门

    “C指针原理教程之C快速入门”是一篇讲解C语言指针的指南,它详细地介绍了C指针的概念、基础与进阶知识,适用于所有初学者或需要加深自己基础知识的人。下面将为你详细讲解这篇攻略。 C指针原理教程之C快速入门:介绍指针 本节主要介绍指针的概念和基础知识,包括定义指针、指针的运算等。同时,本节也将介绍指针的应用,例如数组、函数调用等。 C指针原理教程之C快速入门:指…

    C 2023年5月22日
    00
  • C++小游戏tankwar之界面绘制的详细过程

    下面是“C++小游戏tankwar之界面绘制的详细过程”的完整攻略。 界面绘制的流程 初始化SDL 在使用SDL进行图形绘制前,需要进行SDL库的初始化。调用SDL_Init函数即可进行初始化。同时还需要对SDL图形界面进行设置,包括窗口大小、窗口名称等。 SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部