0

我一直在使用带有指针偏移表示法的指针和数组(我认为)进行类项目程序。下面是用于项目的图表

项目提示

*阴影框代表指针。无阴影框表示动态分配的二维 int 数组。您的程序无法为任何未命名的项目创建命名标识符。行数和列数将由用户输入。图中的椭圆表示行和列的大小是可变的。垂直数组是一个指针数组。每个垂直数组元素都指向一个一维整数数组。

图表

在您的程序中,仅通过 s、t、u 和 v 表示的指针引用整数数组。传递给函数时,您必须始终传递这些指针。您不能取消引用函数调用中的实际参数。您也不能为了使用它们而取消引用指针并将它们分配给变量。*

#include <iostream>
using namespace std;


void fillArray(int **pArray, int rows, int columns)
{
    for(int row = 0; row < rows; row++)
    {
        *(pArray + row) = new int;
        cout << "Enter " <<  " row " << row + 1<< endl;

        for(int col = 0; col < columns; col++)
        {
            cin >> *(*(pArray + row) + col);
        }
    }
}

void printArray(int **pArray, int rows, int columns)
{
    for(int row = 0; row < rows; row++)
    {
        cout << "Row " << row + 1 << endl;
        for(int col = 0; col < columns; col++)
        {
            int num = *(*(pArray + row) + col);
            cout << num << " ";
        }
        cout << endl;

    }
}

void reverseArray(int **pArray, int rows, int columns)
{
    for(int row = 0; row < rows; row++)
    {
        cout << "Reversed Row " << row + 1 << endl;
        for(int col = columns - 1; col >= 0; col--)
        {
            int num = *(*(pArray + row) + col);
            cout << num << " ";
        }
        cout << endl;
    }
}


int main()
{
    int rows;
    int columns;
    cout << ("Input number of rows: ");
    cin >> rows;
    cout << ("Input number of columns: ");
    cin >> columns;

    int **pArray;                   //Initialize array

    int ****s;                      //Initialize pointers s, t, u, v
    **s = pArray;
    int ****t;
    *t = *s;
    int ****u;
    **u = pArray;
    int ****v;
    *v = *u;


    pArray = new int*[rows];        //create pointer to rows. 1st level of indirection
    *pArray = new int[columns];     //create pointer to columns. 2nd level of indirection

    fillArray(pArray, rows, columns);
    printArray(pArray, rows, columns);
    reverseArray(pArray, rows, columns);

    //Loop to terminate program
    while (true)
    {
        cout << "\nEnter letter \'q\' to terminate program\n";
        char c;
        cin >> c;

        if(c == 'q')
            break;
    }
}

抱歉,代码格式不佳。我不明白如何在代码块中复制和粘贴。

所以我的问题是,如何用我的程序实现图表。我从使用指针偏移量创建数组并用它自己的名称标记它的基础开始。

我相信我必须更改所有引用以使用指针变量's、t、u、v。任何帮助表示赞赏。

4

1 回答 1

1

为了至少有所帮助,请注意,关于数组是固定的还是变体的问题并不十分清楚。您有两种尺寸;列数(宽度)和行数(高度)。还要注意这个声明:

“在你的程序中只引用整数数组......”

是胡说八道。有“cols”整数数组,没有一个。

int rows, cols; // acquire rows and cols from wherever.

// create the row vector that will hold the column pointers.
//  this constitutes the first grey box above the main array.

int **rowsp = new int*[rows];


// for each slot we just allocated, set the value an allocation
//  of 'int' values. the list will be `cols` wide

for (int i=0;i<rows;)
    rowsp[i++] = new int[cols];


// thats both white boxes and the first grey box. rowsp points
//  to the allocated pointer array holding 'rows' pointers, each 
//  pointing to an int array hold 'cols' ints.

// now we make the two pointers that point at rowsp
int ***p1 = &rowsp;
int ***p2 = p1;

// and finally, setup s,t,u,v
int ****s = &p1;
int ****t = s;
int ****u = &p2;
int ****v = u;

太棒了,但是阅读您的问题的上下文,这根本不对。根据问题,您只有四个指针可以使用:{s,t,u,v}必须声明一个适当的类型,以允许我们一直构建到最后的 int 数组。看看上面的代码(此时是一次性代码),我们知道我们需要四级间接。所以这一次,我们从s, t, u, and开始v往下走。

int ****s = new int***; // p1 in the prior code
int ****t = s;          // points to the same p1

int ****u = new int***; // p2 in the prior code
int ****v = u;          // points to the same p2

现在我们需要让我们的 p1 和 p2 也指向一个公共指针。这个指针将是rowsp上面代码中的指针(这意味着当我们完成 s、t、u 和 v 时,最终都应该有一个指向它的路径)

*s = new int**;         // s-->p1-->rowsp, t-->p1-->rows
*u = *s;                // u-->p2-->rowsp, v-->p2-->rowsp

现在我们需要分配实际的行向量,它将包含指向整数的指针:

**s = new int*[rows];   // the integer pointer array.

最后,用 'cols' 长度的 int 数组填充这个数组。

for (int i=0;i<cols;++i)
{
    *(**s+i) = new int[ cols ]();
    for (int j=0;j<cols;++j)
        *(*(**s+i)+j) = i+j; // <== beautiful dereference chain =P
}

如果我们做对了,以下内容应该都指向同一件事:

cout << "**s = " << **s << endl;
cout << "**t = " << **t << endl;
cout << "**u = " << **u << endl;
cout << "**v = " << **v << endl;

我把这种疯狂转移到你自己的一角钱上。上面的整个代码库出现在下面的一个连续列表中。您还可以在 ideone.com 上看到它

#include <iostream>

using namespace std;

int main()
{
    static const int rows = 8; // yours would come from user input
    static const int cols = 9;

    int ****s = new int***; // s --> p1
    int ****t = s;          // t --> p1

    int ****u = new int***; // u --> p2
    int ****v = u;          // v --> p2

    *s = new int**;         // s-->p1-->rowsp, t-->p1-->rows
    *u = *s;                // u-->p2-->rowsp, v-->p2-->rowsp

    **s = new int*[rows];   // s --> p1 --> rowsp --> int*[rows]

    for (int i=0;i<rows;++i)
    {
        *(**s+i) = new int[ cols ];
        for (int j=0;j<cols;++j)
            *(*(**s+i)+j) = (i+j) % cols; // <== beautiful dereference chain =P
    }

    cout << "**s = " << **s << endl;
    cout << "**t = " << **t << endl;
    cout << "**u = " << **u << endl;
    cout << "**v = " << **v << endl << endl;;

    cout << "======= S =======" << endl;
    for (int i=0;i<rows;++i)
    {
        for (int j=0;j<cols;++j)
            cout << *(*(**s+i)+j) << ' ';
        cout << endl;
    }
    cout << endl;

    cout << "======= T =======" << endl;
    for (int i=0;i<rows;++i)
    {
        for (int j=0;j<cols;++j)
            cout << *(*(**t+i)+j) << ' ';
        cout << endl;
    }
    cout << endl;

    cout << "======= U =======" << endl;
    for (int i=0;i<rows;++i)
    {
        for (int j=0;j<cols;++j)
            cout << *(*(**u+i)+j) << ' ';
        cout << endl;
    }
    cout << endl;

    cout << "======= V =======" << endl;
    for (int i=0;i<rows;++i)
    {
        for (int j=0;j<cols;++j)
            cout << *(*(**v+i)+j) << ' ';
        cout << endl;
    }
    cout << endl;

    // delete rows.
    for (int i=0;i<rows;++i)
        delete [] *(**s+i);

    // delete row pointer array
    delete [] **s;

    // delete rowsp pointer
    delete *s;

    // and finally, delete s and u (or t and v)
    delete s;
    delete u;

    return 0;
}

输出(指针会有所不同)

**s = 0x100103b60
**t = 0x100103b60
**u = 0x100103b60
**v = 0x100103b60

======= S =======
0 1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 0 
2 3 4 5 6 7 8 0 1 
3 4 5 6 7 8 0 1 2 
4 5 6 7 8 0 1 2 3 
5 6 7 8 0 1 2 3 4 
6 7 8 0 1 2 3 4 5 
7 8 0 1 2 3 4 5 6 

======= T =======
0 1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 0 
2 3 4 5 6 7 8 0 1 
3 4 5 6 7 8 0 1 2 
4 5 6 7 8 0 1 2 3 
5 6 7 8 0 1 2 3 4 
6 7 8 0 1 2 3 4 5 
7 8 0 1 2 3 4 5 6 

======= U =======
0 1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 0 
2 3 4 5 6 7 8 0 1 
3 4 5 6 7 8 0 1 2 
4 5 6 7 8 0 1 2 3 
5 6 7 8 0 1 2 3 4 
6 7 8 0 1 2 3 4 5 
7 8 0 1 2 3 4 5 6 

======= V =======
0 1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 0 
2 3 4 5 6 7 8 0 1 
3 4 5 6 7 8 0 1 2 
4 5 6 7 8 0 1 2 3 
5 6 7 8 0 1 2 3 4 
6 7 8 0 1 2 3 4 5 
7 8 0 1 2 3 4 5 6 
于 2013-01-30T04:07:40.230 回答