찾다

 >  Q&A  >  본문

c++ - 关于二维数组在内存中的存在形式的问题

书上说二维数组在内存中实际是以一维数组的形式连续存放的,我做了个小测试结果却令我无法理解。

#include <iostream>
using namespace std;

int main() {
    int a[2][2] = {{0,1},{2,3}};
    cout << &a << endl;
    cout << a << endl;
    cout << *a << endl;
    cout << a[0] << endl;
    cout << **a << endl;
    cout << *(a[0]) << endl;
    return 0;
}

输出:

0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0
0

那个内存地址处保存的是自己的地址?那么两次解引用不应该还是这个地址才对吗?怎么会变成0???

PHPzPHPz2804일 전905

모든 응답(2)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 15:39:18

    이것을 이해해야 합니다. C에는 1차원 배열만 있지만 배열 요소는 배열 자체를 포함하여 모든 유형이 될 수 있으므로 2차원 배열이 있습니다. 이 경우 배열 이름(이 경우 배열 이름은 배열의 첫 번째 요소에 대한 포인터)을 역참조하면 배열의 첫 번째 요소가 생성되고 2차원 배열의 첫 번째 요소는 1차원 배열이 됩니다. 이므로 역참조는 이 1차원 배열의 첫 번째 요소입니다. 아래의 *(a[0]) 과 동일합니다.

    귀하가 언급한 질문과 관련하여 배열 a의 이름은 배열 a의 내용에 대한 포인터이고 그 값은 첫 번째 요소의 주소와 동일합니다. 2차원 배열의 경우 a 세 값, a[0]의 주소, a0의 주소는 동일하지만, a와 a[0]의 주소는 약간 다릅니다. 같은 의미이며 보조 포인터이지만 a0의 주소는 첫 번째 수준 포인터입니다

    회신하다
    0
  • PHPz

    PHPz2017-04-17 15:39:18

    중단점 디버깅에서 다음 콘텐츠를 모니터링합니다.
    a
    &a
    a 0
    a[0]
    &a[0]

    위 문제에 대해 먼저 세 가지를 알아야 합니다.
    (1) 2차원 배열은 1차원 배열입니다.
    주소가 순차적으로 출력되고 모두 있다는 좋은 증거입니다. 계속해서.
    (2) 어레이 주소는 무엇입니까?
    1차원 배열로 시작하세요int b[2]. 배열 주소는 배열 이름의 주소입니다. 예를 들어 &b는 배열 주소입니다.
    2차원 int a[2][2], a는 2차원 배열 이름, &a는 2차원 배열 주소입니다. a[0]은 첫 번째 줄의 배열 이름(첫 번째 줄이라고 부르겠습니다), &a [0]은 첫 번째 행 배열의 배열 주소입니다. 마찬가지로 a[1]과 &a[1]은 각각 두 번째 행의 배열 이름과 배열 주소입니다.
    (3) 배열 이름은 포인터로 변환될 수 있습니다
    우선 한 가지만 수정하세요int b[2]. 마찬가지로 int a[2][2] 내부의 a도 포인터가 아닙니다. a와 b가 포인터로 변환될 수 있다고 해서 변환이 가능하다는 의미는 아닙니다. 누가 int가 짧다고 말했습니까?

    좋아요, 코드가 왜 이런지 이해하려면 유형을 직접 모니터링하는 것이 가장 좋은 방법입니다.

    a[0] 및 b 유형에 주의하세요.

    회신하다
    0
  • 취소회신하다