2012-01-29 94 views
2

我有一個指向指針的指針,因爲我無法將動態數組傳遞給函數。但是,如果我想用預製數據初始化該指針指針,我該如何設置它,因爲數組的{a,b,c}表示法不適用於指針?如何使用預製數據初始化指針指針?

+1

爲什麼你不能將動態數組傳遞給函數?什麼是函數簽名?你對動態數組有什麼瞭解?發佈相關代碼,例如要使用的函數,要傳遞的數據,然後說明問題! – Nawaz 2012-01-29 04:16:16

+0

我不想被傳遞給函數時定義數組的大小所限制。我想有n個數組和x個y數組。 – BLaZuRE 2012-01-29 04:53:15

+0

這意味着,你不知道什麼* dynamic *數組,是嗎? – Nawaz 2012-01-29 05:07:31

回答

1

你可以這樣做:

static int row1[] = {1, 2, 3}; 
static int row2[] = {4, 5, 6, 7}; 
static int row3[] = {8, 9, 10, 11, 12, 13}; 
static int *pptr[] = {row1, row2, row3}; 

在這一點上,pptr可以分配到一個int**

int **p = pptr; 
+0

謝謝,這個解決方案有效。我不喜歡它,因爲在我的腦海中,我認爲有一個更優雅的解決方案,或者我做錯了矩陣。它的工作原理雖然很直觀。 – BLaZuRE 2012-01-29 04:50:11

+1

@BLaZuRE鑑於您可以使用C++庫的強大功能,所以選擇執行矩陣的雙指針確實看起來並不理想。一個更好的選擇是矢量矢量,因爲內存將自動爲您管理。 – dasblinkenlight 2012-01-29 13:59:53

0

[如果你需要一個雙*這答案只有相關。你的問題是編輯說指針的指針 - 如果這是你需要什麼,這個答案是不相關]

你可以這樣做,而不是:

double fValues[3] = { 1, 2, 3 };

變量fValues已經是一個指針 - 。沒有[]的數組變量是指向數組的第一個元素的指針。這不是一個動態數組,所以你不需要分配/釋放它的內存。

假設你的函數,需要一個雙指針看起來是這樣的:

void Func(double* pDbl) {...}

你這樣稱呼它:

Func(fValues);

0

可以遞歸創建小的動態數組像這樣:

#include <stddef.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

typedef struct 
{ 
    int* pValues; 
    size_t Count; 
} List; 

const List ListEnd = { NULL, 0 }; 

List NewList(int Value, List SubList) 
{ 
    List l; 

    l.Count = SubList.Count + 1; 

    if (SubList.Count == 0) 
    { 
    l.pValues = malloc(sizeof(int)); 
    } 
    else 
    { 
    l.pValues = realloc(SubList.pValues, l.Count * sizeof(int)); 
    } 

    if (l.pValues == NULL) 
    { 
    // do proper error handling here 
    abort(); 
    } 

    // moving data isn't necessary if the list elements are 
    // in the reverse order 
    memmove(&l.pValues[1], &l.pValues[0], SubList.Count * sizeof(int)); 

    l.pValues[0] = Value; 

    return l; 
} 

void PrintDynArr(int* pValues, size_t Count) 
{ 
    while (Count--) 
    { 
    printf("%d\n", *pValues++); 
    } 
} 

int main(void) 
{ 
    int* p; 

    PrintDynArr(p = NewList(1, 
        NewList(2, 
        NewList(3, 
        NewList(4, ListEnd)))).pValues, 
       4); 

    free(p); 

    return 0; 
} 

輸出:

1 
2 
3 
4 
+0

你爲什麼要這樣做,而不是僅僅使用'std :: vector'? – 2012-01-29 18:02:55