这边先简单介绍一下内存分区。
内存按照用途划分为五个区:
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)的时候使用数组(甚至html" target="_blank">函数的声明和定义可以用指针和数组混搭)。例如:
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]; /* ptr1 和 arrInt 的值是一样的,都是同一块内存空间的首地址。 这种形式规定了 ptr1 指向了一个包含10个元素的整形数组,书写麻烦,同时也限制了指针,因此很少用。 */ int (*ptr1)[10] = &arrInt; /* 这种形式就是我们比较熟悉和喜闻乐见的了。 在前面一块代码中,在实参中传入数组名,实际上做了这样一件事情: int *ptr = arrInt; 形式参数是一个指向了 arrInt 的指针。 重点要解释的地方在下一块代码中说明~~~ */ int *ptr2 = arrInt;
在C++中,有一种引用类型,相当于给变量取了个别名,在传递参数的时候就不会拷贝参数,提高了效率,减少了内存开销。
显而易见,在传递数组参数的时候,可以使用数组的引用。
数组的引用也有不同的方式:
int arrInt[10]; //和指向数组的指针的第一种定义方式类似 int (&ref1)[10] = arrInt; //这样写怎么样? int *&ref2 = arrInt; /* 编译器会报错: invalid initialization of non-const reference of type 'int*&' from an rvalue of type 'int*'. 原因在于,在栈区中的数组 arrInt 由系统控制,它的地址不能改变。 如果上面的代码可以通过,就意味着可以通过 ref2 指向其他的地址,从而修改 arrInt 的内存地址,这是不允许的,所以编译不通过。 */ /* 可以这样做。 ref3 是一个引用,并且是一个常量的引用,引用的是一个 int* 。 由于 ref3 是一个常量引用,它的值不允许被修改,因此 ref3 就能够引用 arrInt。 */ int * const &ref3 = arrInt;
啰啰嗦嗦讲了这么多,其实就一句话——
在栈区中的数组是一种不能改变地址的指针,或者说是一种 const 指针。
o(╯╰)o
(再多一句~~~)
而在堆区中动态申请内存的数组,也就是我们平时在用的指针。
以上就是浅谈C/C++中指针和数组的不同的详细内容,更多关于c/c++ 指针和数组的资料请关注小牛知识库其它相关文章!
C++ 指针 在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { cout << "Va
C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值
C++ 指针 指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。请看下面的程序:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *pt
本文向大家介绍浅谈C++对象组合,包括了浅谈C++对象组合的使用技巧和注意事项,需要的朋友参考一下 以上所述就是本文的全部内容了,希望大家能够喜欢。
在print语句中:(假设整数大小为4字节) 让arr的内存位置为1000 arr 1——给出1016(即下一行内存) 我理解了逻辑,但我无法理解编译器如何将 arr标识为“指向4整数数组的指针”,并且 即使在增量之前两者都指向相同的地址(1000)
本文向大家介绍浅谈C#.NET、JavaScript和JSON,包括了浅谈C#.NET、JavaScript和JSON的使用技巧和注意事项,需要的朋友参考一下 写在前面 全部手打,没有多余的话,全部干货,基本上用到的我就记录了。 一、什么是JSON JSON:JavaScript Object Notation,是一种轻量级的数据交互格式,主要用于数据传输。 二、JSON语法规则 1、数据由键值