指向int数组的指针c ++

van*_*cke 3 c++ arrays pointers reference

我编写了以下代码,试图了解如何使用指向数组和数组引用的指针.这是我对正在发生的事情的思考过程.

  1. arr与数组的第一个元素的地址相同.*arr给我这个位置的int是什么样的arr[0].
  2. p是一个指针,并被分配arr,这是第一个元素的地址.所以本质上*p是相同的*arr,p[0]也是相同的arr[0].
  3. 在这里,我不明白发生了什么.arrPtr是一个指向十个整数数组的指针.为什么没有*arrPtrarrPtr[0]给我9的价值?
  4. arrRef是对十个整数数组的引用,与上面的点不同,*arrRef或者arrRef[0]产生值9.

这是我的代码:

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
    int arr[10] = {9, 18, 31, 40, 42};
    cout << "arr: " << arr << endl;
    cout << "*arr: " << *arr << endl;
    cout << "arr[0]: " << arr[0] << endl;
    cout << endl;

    int *p = arr;
    cout << "p: " << p << endl;
    cout << "*p: " << *p << endl;
    cout << "p[0]: " << p[0] << endl;
    cout << endl;

    int (*arrPtr)[10] = &arr;
    cout << "arrPtr: " << arrPtr << endl;
    cout << "*arrPtr: " << *arrPtr << endl;
    cout << "arrPtr[0]: " << arrPtr[0] << endl;
    cout << endl;

    int (&arrRef)[10] = arr;
    cout << "arrRef: " << arrRef << endl;
    cout << "*arrRef: " << *arrRef << endl;
    cout << "arrRef[0]: " << arrRef[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

arr: 0xbf843e28
*arr: 9
arr[0]: 9

p: 0xbf843e28
*p: 9
p[0]: 9

arrPtr: 0xbf843e28
*arrPtr: 0xbf843e28
arrPtr[0]: 0xbf843e28

arrRef: 0xbf843e28
*arrRef: 9
arrRef[0]: 9
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 7

*arrPtr或者arrPtr[0]产生该类型的对象int[10]

operator <<数组中使用显式转换为类型的指针,int *并为这样的表达式选择operator <<参数的重载const void *.

你可以看到这些输出

arr: 0xbf843e28
Run Code Online (Sandbox Code Playgroud)

*arrPtr: 0xbf843e28
arrPtr[0]: 0xbf843e28
Run Code Online (Sandbox Code Playgroud)

重合.

如果要输出数组的第一个元素,则应该编写

std::cout << **arrPtr << std::endl;
std::cout << ( *arrPtr )[0] << std::endl;
std::cout << arrPtr[0][0] << std::endl;
std::cout << *arrPtr[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

为了更清楚,你可以引入一种参考方式

int ( &arrRef )[10] = *arrPtr;
Run Code Online (Sandbox Code Playgroud)

然后写

std::cout << *arrRef << std::endl;
std::cout << arrRef[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)