gpt4 book ai didi

c++ - 二维数组中的指针运算

转载 作者:行者123 更新时间:2023-11-30 01:34:27 25 4
gpt4 key购买 nike

我正在学习 C++。所以,请原谅我问这么长的问题。

我已经为数组编写了以下程序。我知道数组的基地址被返回并且数组的名称指向它。所以,对于一维数组,我可以理解为

arr + 1

返回数组下一项的地址即

arr + 4bytes

然而,在二维数组的情况下,它有点不同。我从下面的 cout 语句中了解到,在内存 arr2D[0]、arr2D[1]..arr2D[4] 中,由于有 5 个列,即 将一个接一个地分配 20 个字节5 * 4 字节

arr2D & arr2D[0] 指向与预期相同的基地址; 第 43 和 45 行

所以,如果我这样做

arr2D[0] + 5

我得到 arr2D[1] 的地址; 第 47 行。但是,当我这样做的时候

arr2D + 5

我从基地址得到一个100字节的内存地址; 第 50 行。我不明白为什么。谁能给我解释一下?

#include <iostream>

using namespace std;

int main() {

int arr[5] = {0,1,2,3,4};

cout << "Printing arr" << endl;
for (int i = 0; i < 5; i++) {
cout << *(arr + i) << " ";
}
cout << endl;

cout << "Base address of 'arr': " << (unsigned long) arr
<< " EQUALS " << "&arr: " << (unsigned long) &arr
<< endl;

cout << "Address of 2nd item i.e. i = 1 is: " << (unsigned long) (arr+1)
<< endl;

cout << "arr[1] = " << arr[1] << ", "
<< "1[arr] = " << 1[arr] << ", "
<< "*(arr + 1) = " << *(arr + 1)
<< endl << endl;


int arr2D[5][5] = {{1,2,3,4,5},
{3,4,5,6,7},
{5,6,7,8,9},
{7,8,9,10,11},
{9,10,11,12,13}};

cout << "Printing arr2D" << endl;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
cout << *(arr2D[i] + j) << " ";
}
cout << endl;
}
cout << endl;


cout << "Base address of arr2D = " << (unsigned long) arr2D << endl; // this is fine

cout << "Address of arr2D[0] = " << (unsigned long) &arr2D[0] << endl; // this is fine

cout << "Address of arr2D[1] = " << (unsigned long) arr2D[1] << " EQUALS "
<< (unsigned long)(arr2D[0] + 5) << endl; // this is fine

cout << "Address of arr2D[1] = " << (unsigned long) arr2D[1] << " NOT EQUALS "
<< (unsigned long)(arr2D + 5) << endl; // I do not understand this, as arr2D and arr2D[0] is same

cout << "Address of arr2D[1][0] = " << (unsigned long)&arr2D[1][0] << endl;

cout << "arr2D[1][0] = " << *((arr2D[0] + 5) + 0) << endl;
}

最佳答案

arr2D[0]arr2D 指向相同的地址,但它们指向不同的类型

arr2D[0] 是二维数组的第一行,因此它衰减为指向该行第一个元素的指针(单个 int)。同时,arr2D 是一个二维数组(一个数组的数组),因此它会衰减到指向第一行的指针(一个 5 元素数组)。

如您所知,指针运算会根据指针所指向的对象的大小进行缩放。由于 arr2D 指向 5 个元素的 int 数组,指向的每个对象的大小为 4*5=20 字节(假设为 32 位整数),因此将指针增加 5 会导致相差 20 *5=100 字节。

关于c++ - 二维数组中的指针运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com