详解C++数组和数组名问题(指针、解引用)攻略
数组和指针
在C++中,数组是以连续的内存空间存储了相同类型的数据。数组名指的是数组在内存中的起始地址。因此,可以将数组名看做指向数组第一个元素的指针。
下面是一个简单的示例:
#include <iostream>
int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
std::cout << arr << std::endl; // 输出数组的地址
std::cout << &arr[0] << std::endl; // 输出数组第一个元素的地址
std::cout << *arr << std::endl; // 解引用数组名,输出第一个元素的值
std::cout << *(arr + 1) << std::endl; // 输出第二个元素的值
std::cout << arr[2] << std::endl; // 使用下标访问第三个元素的值
return 0;
}
输出:
0x7ffc6ac31c40
0x7ffc6ac31c40
1
2
3
在示例中,arr
和&arr[0]
输出的地址是一样的,这也表明了arr
是指向数组第一个元素的指针。指针也可以使用算术运算符+
和-
,如*(arr+1)
表示访问数组的第二个元素。同时,我们也可以使用数组下标访问数组元素,如arr[2]
表示访问数组的第三个元素。
数组名和指针的差别
虽然arr
可以看作指向数组第一个元素的指针,但是数组名和指针并不完全一样。
首先,数组名是常量,它指向的地址是不可改变的。也就是说,我们不能将数组名指向另一个地址。例如:
int arr[5] = { 1, 2, 3, 4, 5 };
int* pArr = arr; // 错误:不能将数组名指向另一个地址
其次,对数组名解引用得到的是数组第一个元素的值,而不是数组的地址。例如:
int arr[5] = { 1, 2, 3, 4, 5 };
std::cout << *arr << std::endl; // 输出1,而不是数组的地址
示例说明
以下是两个关于数组和指针的示例:
示例一:使用指针访问数组元素
#include <iostream>
int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
int* pArr = arr; // 指针指向数组的第一个元素
for (int i = 0; i < 5; i++) {
std::cout << *(pArr + i) << " "; // 输出数组元素的值
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4 5
在示例中,我们使用指针pArr
访问了数组arr
中的每一个元素,并输出了这些元素的值。
示例二:传递数组名作为函数参数
#include <iostream>
void printArr(int arr[], int size) {
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " "; // 输出数组元素的值
}
std::cout << std::endl;
}
int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
printArr(arr, 5); // 传递数组名作为函数参数
return 0;
}
输出:
1 2 3 4 5
在示例中,我们定义了一个函数printArr
,其中第一个参数arr[]
是数组名,它将作为函数参数被传递。在函数内部,我们访问了数组arr
中的每一个元素,并输出了这些元素的值。在主函数中,我们调用了函数printArr
,并将数组arr
的名称和元素数量作为参数传递给它。由于数组名作为参数被传递,因此函数中的形参arr[]
实际上指向了数组arr
在内存中的起始地址。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++数组和数组名问题(指针、解引用) - Python技术站