gpt4 book ai didi

c++ - 为什么 A[i][j] 和 *((int*)A + i * n + j) 给出不同的输出?

转载 作者:行者123 更新时间:2023-12-02 01:42:58 27 4
gpt4 key购买 nike

我正在学习 C++ 指针。我的导师提到*((int*)A + i * n + j)是另一种线性化 A[i][j] 的方法符号。我尝试在这个 main 函数中使用 2x4 2D 数组来测试它。

int main()
{
int** A = new int* [100];
for (int i = 0; i < 2; ++i)
{
A[i] = new int[100];
}

//assign value
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 4; ++j)
cin >> *((int*)A + i * 4 + j);
//cin >> A[i][j]; //if I do this instead of the line above, I will get trash values in the output

for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 4; ++j)
{
cout << *((int*)A + i * 4 + j) << " ";
}
cout << "\n";
}

for (int i = 0; i < 2; ++i)
delete[] A[i];
delete [] A;
}

示例输入:

1 2 3 4
5 6 7 8

我不明白为什么当我这样做

cin >> A[i][j];

然后

cout << *((int*)A + i * 4 + j) << " ";

它给了我垃圾值。这是否意味着我必须cin >> *((int*)A + i * 4 + j);如果我要cout << *((int*)A + i * 4 + j) << " ";

我的另一个问题是:为什么我必须显式转换 (int*) ?为什么不能(A + i * 4 + j)

最佳答案

你完全误解了老师想要告诉你的内容。他们的描述中的关键字是“符号”,但他们遗漏了一些重要的内容(我稍后会介绍)

首先,如果您的教练告诉您这样做:

*((int*)A + i * n + j)

质疑他们所说的一切。这种强制转换既没有必要,也不建议这样做,而且除了隐藏不良代码之外什么也做不了。如果 A 是正确的类型,那么执行此操作就足够了:

*(A + i*n + j)

如果它不是正确的类型,您可能一开始就不应该这样做(您刚刚发现)。

其次,您的讲师没有告诉您的是,这对于使用创意在单维数组的线性空间中建立人造多维数组很有用。索引。关键是单维数组。作案手法是这样的:

鉴于希望将 M 行 N 列的 2D 空间映射到 M*N 元素的 1D 空间,您可以这样做:

constexpr size_t M = 10;
constexpr size_t N = 5;

int A[M*N];
A[row * N + col] = value;

// equivalent to...
*(A + row * N + col) = value;

注意,row 应在 0...(M-1) 范围内,col 应在 0..(N-1) 范围内(包含在内) .

这个模型可以扩展到更多维度。例如,“3D”映射,L 表示板,M 表示行,N 表示列:

constexpr size_t L = 10;
constexpr size_t M = 8;
constexpr size_t N = 5;

int A[L*M*N];

A[slab * (M*N) + row * N + col] = value;

// equivalent to...
*(A + slab * (M*N) + row * N + col) = value;

其中 slab 在 0...(L-1) 范围内,row 在 0...(M-1) 范围内,最后col 的范围为 0...(N-1)。

您应该看到一个模式正在形成。只要您知道每个维度的限制,任何 native 单维数组都可以使用多维表示形式制造的下标进行索引,并且生成的索引不会破坏单维数组床。

大多数时候您不需要这样做,但有时它会派上用场,尤其是在 C++ 中,因为它缺乏 C 提供的运行时 VLA 支持。

因此,正确使用你的导师试图告诉你的内容应该是这样的:

#include <iostream>

int main()
{
static constexpr size_t M = 2;
static constexpr size_t N = 4;

int *A = new int[M*N];

//assign value
for (size_t i = 0; i < M; ++i)
{
for (size_t j = 0; j < N; ++j)
std::cin >> *(A + i * N + j);
}

for (size_t i = 0; i < M; ++i)
{
for (size_t j = 0; j < N; ++j)
std::cout << *(A + i * N + j) << " ";
std::cout << "\n";
}

delete [] A;
}

关于c++ - 为什么 A[i][j] 和 *((int*)A + i * n + j) 给出不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71339808/

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