在C++中,数组和指针都是常用的数据类型,它们有一些相似之处,但也有很明显的区别:
1、定义方式
定义数组时需要指定数组的大小,如下所示:
int arr[5]; // 定义一个大小为5的整型数组
而定义指针时只需要指定指针变量的类型,如下所示:
int *p; // 定义一个整型指针
2、取地址
对于数组,可以使用数组名来获取数组的首地址,如下所示:
int arr[5];
int *p = &arr[0]; // 获取数组arr的首地址
对于指针变量,可以使用取地址符&来获取指针变量的地址,如下所示:
int a = 10;
int *p = &a; // 获取变量a的地址,赋值给指针变量p
3、使用方式
数组和指针的使用方式也有所不同。
对于数组,可以通过数组名加索引的方式来访问数组元素,如下所示:
int arr[5] = {1, 2, 3, 4, 5};
int x = arr[2]; // 访问数组arr的第3个元素,即3
对于指针变量,可以通过解引用符*来访问指针指向的值,如下所示:
int a = 10;
int *p = &a; // 获取变量a的地址,赋值给指针变量p
int x = *p; // 访问指针变量p指向的值,即10
需要注意的是,指针变量也可以通过加减运算来访问数组元素,如下所示:
int arr[5] = {1, 2, 3, 4, 5};
int *p = &arr[0]; // 获取数组arr的首地址,赋值给指针变量p
int x = *(p + 2); // 访问数组arr的第3个元素,即3
4、内存分配方式
数组在定义时就已经确定了数组的大小,因此数组的内存空间是在编译时分配的,数组的大小不能动态改变。
而指针变量是可以动态分配内存空间的,可以使用new关键字来在堆上动态分配内存,如下所示:
int *p = new int; // 在堆上动态分配一个整型变量,返回其地址给指针变量p
delete p; // 释放p指向的动态内存空间
此外,还可以使用new关键字来在堆上动态分配一个数组,如下所示:
int *arr = new int[5]; // 在堆上动态分配一个大小为5的整型数组,返回其首地址给指针变量arr
delete[] arr; // 释放arr指向的动态内存空间
以上就是数组和指针的区别,需要根据具体的应用场景选择使用哪种数据类型。