-1

私は C++ プログラミングの初心者であり、 Alex Alllain の Jumping into C++という電子ブックを読んで言語を学ぼうとしています。現在、動的メモリ割り当ての章を終えており、ポインターが理解しにくいと言わざるを得ません。

この章の最後には、私が試すことができる一連の練習問題があります。任意の次元の乗算表を作成する関数を作成する最初の問題 (コードを機能させるのに時間がかかりました) を完了しました(問題にポインターを使用する必要があります)、しかし、それが正しい場合、私は自分の解決策に満足しておらず、ポインターを正しい方法で使用している場合は、経験のある人に欠陥を指摘してもらいたいです。問題に対する独自の解決策:

// pointerName.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <iostream>
#include <string>

void multTable(int size){

    int ** x, result;
    x = new int*[size]; //  lets declare a pointer that will point to another pointer :).
    result = 0; 

    for(int h = 0; h < size; h++){ // lets store the address of an array of integers.
            x[h] = new int [size];      
    }
    std::cout << std::endl << "*********************************" << std::endl; // lets seperate. 
    for(int i=0; i < size+1; i++){ // lets use the pointer like a two-dimensional array.
        for(int j=0; j < size+1; j++){
            result = i*j; // lets multiply the variables initialized from the for loop.
            **x = result; // lets inialize the table.
            std::cout << **x << "\t"; // dereference it and print out the whole table.
        }
        std::cout  << std::endl;
    }
    /************* DEALLOCATE THE MEMORY SPACE ************/
    for(int index = 0; index < size; index++){
        delete [] x[index]; // free each row first.  
    }
    delete [] x; // free the pointer itself.
}

int main(int argc, char* argv[]){

    int num;
    std::cout << "Please Enter a valid number: ";
    std::cin >> num; // Lets prompt the user for a number.
    multTable(num);

    return 0;
}
4

2 に答える 2

2

billz の発言と **x は x[i][j] に変更する必要があります。あなたは新しいように見えるので、乗算表を別のブロックとして出力することをお勧めします (2 つの for ループの外側)。

于 2013-01-08T00:42:08.043 に答える
1

ここ:

for(int i=0; i < size+1; i++){ // lets use the pointer like a two-dimensional array.
    for(int j=0; j < size+1; j++)

次のボットを正しく実行した場合、配列の末尾を超えてインデックスを作成するため、問題が発生する可能性があります。幸いなことに(次のバグがあります)。これらの行は次のようになっているはずです。

for(int i=0; i < size; i++){ // lets use the pointer like a two-dimensional array.
    for(int j=0; j < size; j++)

この行:

 **x = result; // lets inialize the table.

あなたはおそらく次のことを意味します:

x[i][j] = result; // lets inialize the table.

注: // 最初のバグにより、x[i] が配列の末尾から 1 つずれていたことに注意してください。

配列を割り当てる場合:

 x = new int[size];

要素にアクセスできます: x[0] => x[size-1]

これは、size要素が存在するためですが、 からカウントを開始しているため0です。

于 2013-01-08T00:55:09.767 に答える