2012-03-03 72 views
0

我有一個變量類型:如何在C中傳遞char(*)([long unsigned int])作爲參數?

char (*p)[12] = calloc(n, sizeof(*p)); 

我需要的變量保持這樣,但我有把它當作一個參數的麻煩,由於功能型給我的錯誤:

void myMethod(char *p) { ... } 

我可以在myMethod中使用哪些參數來使其工作?

+0

我認爲你的意圖可能是使用'char * p [12]'而不是你在這裏。 – Swiss 2012-03-03 16:46:40

回答

2

使用相同類型的參數,像你一樣的副本爲變量:

void myMethod(char (*p)[12]) 
{ 
    // do something with p 
} 
... 
char (*p)[12] = calloc(n, sizeof *p); 
myMethod(p); 

記住p是指向的char 12元件陣列,而不是一個簡單的指針char。因此,p[i]的類型將是char [12](其在大多數情況下將衰減到char *)。

0

典型的C語言習慣是通過char*size_t(或unsigned int或任何等效的參數)參數。然後該函數的契約是它將尊重size_t參數作爲數組/緩衝區的長度。

如果您必須堅持指針未更改,則使用const限定符。

+0

在一般情況下,這是真的,我認爲這可能是更乾淨的沒有size_t,因爲數組大小是恆定的 – Swiss 2012-03-03 16:41:53

4

我可以在myMethod的用什麼作爲參數,使這項工作

可能這:

void myMethod(char (*p)[12]) 
-2
char (*p)[12] = ... 

與以前你有定義的12個元素的數組,每個元素都是一個指向char的指針但是指向具有12個char元素的數組的指針。在

int *a[3]; 

開始:

如以下行說明。向右看,說大小爲3的數組。向左看,說出指針。看正確,什麼都看不到。向左看,說int。所有你一起說a是一個int大小3指針的數組。

添加括號時會很奇怪:

int (*a)[3]; 

括號更改順序,就像在一個表達式。當你在a後面看時,你會看到右邊的圓括號,在你向左看時你不能跳過。因此,你會說a是一個指向3個整數的指針。

檢查這些鏈接,更好的解釋:


不過,如果你想將數組傳遞給函數,你可以複製它,或者因爲它是一個數組傳遞指向第一個元素的指針(您可以簡單地通過使用數組名稱來完成):

myMethod(p) <- how you call the function 

我個人傾向於後一種情況下,因爲你傳遞給函數的簡單的指針,而不是數組的所有元素

+2

否 - 他已宣佈'p'爲指向12個元素的數組'char',而不是指向'char'的指針數組。 – 2012-03-03 16:35:37

+1

@JohnBode - 讓我注意到......我只是靠在牆上!但是,嘿,我只是證明你可以從答案中學習! – Matteo 2012-03-03 16:51:19

相關問題