栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

浅谈C/C++中指针和数组的不同

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈C/C++中指针和数组的不同

这边先简单介绍一下内存分区。

内存按照用途划分为五个区:

1.栈区:由系统控制分配和回收。

例如定义变量 int x = 0; int *p = NULL; 变量所占的内存都是分配在栈区的。

2.堆区:由程序员管理。

在C语言中由 malloc 申请的内存,或者在C++中,用 new 申请的内存,是在堆区中申请的。用完之后需要程序员自己回收,否则会造成内存泄漏。

3.全局区:存储全局变量及静态变量

4.常量区:存储常量。

5.代码区:存储编译之后的二进制代码。

数组和指针具有很大的相似性,实际上,数组也是一种指针,一种有点特别的指针。
例如,可以这样申请包含10个 int 型数据的数组

//方式1
int arr[10]; //栈区
//方式2
int *ptr = new int[10]; //堆区

我们也常常在定义一个函数的时候使用指针,而传入实参(argument)的时候使用数组(甚至函数的声明和定义可以用指针和数组混搭)。例如:

void func(int *ptr, int n) {
 //statements
}

int main(void) {
 int arr[10];
 ...
 func(arr, 10);
 return 0;
}

数组名代表着一个地址,是其所占内存单元的首地址。在上例中,arr 和 &arr[0] 是相同的。

数组名表示一个地址,这一点和指针一样。不一样的地方在于数组名是一个固定的地址,数组是存放在栈区的,其地址不能改变,也即是一个 const 。
在用一个指针指向数组的时候,可以有几种形式。

int arrInt[10];

int (*ptr1)[10] = &arrInt;

int *ptr2 = arrInt;

在C++中,有一种引用类型,相当于给变量取了个别名,在传递参数的时候就不会拷贝参数,提高了效率,减少了内存开销。
显而易见,在传递数组参数的时候,可以使用数组的引用。
数组的引用也有不同的方式:

int arrInt[10];
//和指向数组的指针的第一种定义方式类似
int (&ref1)[10] = arrInt;
//这样写怎么样?
int *&ref2 = arrInt;


int * const &ref3 = arrInt;

啰啰嗦嗦讲了这么多,其实就一句话——
在栈区中的数组是一种不能改变地址的指针,或者说是一种 const 指针。
o(╯╰)o
(再多一句~~~)
而在堆区中动态申请内存的数组,也就是我们平时在用的指针。

以上就是浅谈C/C++中指针和数组的不同的详细内容,更多关于c/c++ 指针和数组的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/61597.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号