设为首页 加入收藏

TOP

数组名和指针的区别
2023-07-23 13:29:04 】 浏览:20
Tags:

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

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

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(数组名),该情况返回整个数组的长度。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言程序设计 下一篇《程序员的自我修养》学习笔记—..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目