【问题标题】:Understanding the use of pointers了解指针的使用
【发布时间】:2013-02-11 20:12:58
【问题描述】:

嗨,我遇到了一个代码,我很难理解它为什么会起作用,如果有人能解释我,我将不胜感激 这是代码这实际上是一个非常简化的真实代码版本,可以在这里找到http://acts.nersc.gov/hypre/example10/ex10.cxx.html

#include <iostream>
int main(int argc, char *argv[]){
double ***elemStiff = new double**[10];
int i, k;

for (i = 0; i < 10; i++){
    elemStiff[i] = new double*[4];
    for (k = 0; k < 4; k++){
        elemStiff[i][k] = new double[4];
    }

    double **A = elemStiff[i];
    for (k = 0; k < 4; k++)
        A[k][k] = 2/3.;

    A[0][1] = A[1][0] = -1/6.;
    A[0][2] = A[2][0] = -1/3.;
    A[0][3] = A[3][0] = -1/6.;
    A[1][2] = A[2][1] = -1/6.;
    A[1][3] = A[3][1] = -1/3.;
        A[2][3] = A[3][2] = -1/6.;
    }
    std::cout << elemStiff[1][0][0] << std::endl;
}

简而言之,这里我们初始化并填充 elemStiff 数组的值,该数组有 10 行,每行是一个 4x4 矩阵。

对我来说很奇怪的是,代码在 double **A = elemStiff[i]; 的帮助下填充了 elemStiff 数组的条目;

当我第一次看到它时,虽然它会给出一个错误,但它确实有效!。在 A 上传递的值,它们同时在 elemStiff 数组上传递,但我不明白它为什么起作用

谢谢

【问题讨论】:

  • 因为它们指向内存中的同一个东西,所以两个数组都更新了相同的值。
  • 我为自己制定了一条规则,在我的代码中永远不要有***。这让我很头疼。而这里只是屏蔽了一个 10x4x4 的数组,可以直接创建。当然,除非这是为了说明目的而进行的简化。
  • 谢谢,我想如果我删除 elemStiff 就足够了,我也不需要删除 A 数组

标签: c++ arrays pointers dynamic-memory-allocation double-pointer


【解决方案1】:

让我们从更简单的版本开始:

int* array = new int[10];
int* ptr = array;            // equivalent to ptr = &array[0]

for (int i = 0; i < 10; ++i)
    ptr[i] = i;              // writing into the memory that ptr points to

for (int i = 0; i < 10; ++i)
    std::cout << array[i];   // outputs: 0123456789

在这个例子中,我们创建了一个指针ptr,它指向array 的第一个元素。然后,当我们写入ptr 指向的内存时,我们实际上是在写入array。因此,当我们检查 array 元素的值时,我们可以看到它们已正确初始化。

您的代码几乎相同,只是一个由 10 个二维数组组成的数组:

double ***elemStiff = new double**[10];

然后就像我们在我的简单示例中使用 ptr 一样,您使用临时指针 A 使其指向这 10 个二维数组中的每一个:

for (i = 0; i < 10; i++)
    double **A = elemStiff[i];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多