簡體   English   中英

C ++簡單指針傳遞

[英]C++ Simple Pointer Passing

我對C ++還是很陌生,在接觸所有指針方面遇到一些問題。 基本上,我將指針傳遞給函數,並在該指針處創建一個數組。 回到main函數中,我無法訪問該數組。

這是我的代碼:

#include <iostream>

using namespace std;

void createArray(char** dict, int* arraysize)
{
    *arraysize = 26*26*26*26;

    delete dict;
    dict = 0;

    //Initialisiere character array of character
    //char **wortliste = 0;
    dict = new char*[*arraysize];
    for(int i = 0; i < *arraysize; i++)
        dict[i] = new char[5];

    int ctr = 0;

    //Erstelle Einträge (sortiert)
    for (char i = 'A'; i <= 'Z'; i++)
    {
        for (char j = 'A'; j <= 'Z'; j++)
        {
            for (char k = 'A'; k <= 'Z'; k++)
            {
                for (char l = 'A'; l <= 'Z'; l++)
                {
                    dict[ctr][0] = i;
                    dict[ctr][1] = j;
                    dict[ctr][2] = k;
                    dict[ctr][3] = l;
                    dict[ctr][4] = '\0';
                    ctr++;
                }
            }
        }
    }
}

int main(void)
{
    char** dict = 0;
    int arraysize;

    createArray(dict, &arraysize);

    cout << dict[0] << endl << dict[arraysize-1] << endl;

    return 0;
}

我無法弄清楚我的錯誤,非常感謝您。

在C ++中,參數按值傳遞(除非顯式標記為引用參數),因此,當您將dict (指向char的指針)傳遞給createArray ,函數內部的dict是一個不同的對象,盡管具有相同的初始值值,作為dictmain 如果要查看main dict更改,則必須通過引用將其傳遞,或將其地址傳遞給帶有char ***的函數。

例如

void createArray(char**& dict, int* arraysize)

要么

void createArray(char*** pdict, int* arraysize)
{ // use (*pdict) instead of dict ...

// ...
createArray(&dict, &arraysize);

一種更“ C ++”的方式來實現您想要的是:

void createArray( std::vector<std::string>& dict );

和簡單有createArray調整vector到所需的大小。 使用vectorstring類的標准容器還可以使您免於顯式地取消分配所分配的內存的義務,該內存當前在代碼中丟失。

有兩個錯誤。

  1. 刪除數組:

     char **array = /* new with whatever */; /* do your work */ for (i = 0; i < array_size; ++i) delete[] array[i]; delete[] array; 
  2. 要新建一個數組:

     char **array = new char *[array_size]; for (i = 0; i < array_size; ++i) array[i] = new char[array_size_2]; 
  3. delete ing時,要確保您不遍歷一個不是new ed數組,請針對NULL檢查:

     for (i = 0; i < array_size; ++i) { if (array[i] != NULL) /* Or simply if (array[i]) */ delete[] array[i]; array[i] = NULL; } if (array != NULL) delete[] array; array = NULL; 

    另外,由於delete仍然會檢查NULL ,因此您可以將其簡化為:

     if (array != NULL) for (i = 0; i < array_size; ++i) delete[] array[i]; /* no need to set to NULL after if going to delete the array */ delete[] array; array = NULL; 

注意: delete刪除單個對象,而delete[]刪除數組。

我無法想象如何處理此類數據,但您至少可以使用現代技術。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<string> create() {
    vector<string> result;
    for (char i = 'A'; i <= 'Z'; ++i) {
        for (char j = 'A'; j <= 'Z'; ++j) {
            for (char k = 'A'; k <= 'Z'; ++k) {
                for (char l = 'A'; l <= 'Z'; ++l) {
                    result.push_back(string() + i + j + k + l);
                }
            }
        }
    }
    return result;
}

int main() {
    vector<string> data = create();
    cout << data.front() << endl << data.back() << endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM