2012-06-09 52 views
1

如何指定一個方法應該將參數指向一個可以容納指定數量值的內存位置的指針?舉例來說,如果我有:指向指定數量的值的指針

- (void)doSomethingWith:(int *)values; 

我想明確指出通過在int *應指向內存中分配的空間,這是能容納10個這樣的值。

回答

1

要直接回答您的問題,請使用帶有邊界的數組參數,例如:

- (void)takeTenInts:(int[10])array 

其中指定該方法採用10個整數的數組。

唯一的問題是C語言家族不做邊界檢查,所以下面是有效的:

int a[10], b[5]; 

[self takeTenInts:a]; // ok 
[self takeTenInts:b]; // oops, also ok according to the compiler 

因此,儘管你是指定的大小,因爲你希望這樣做,該規範是沒有被強制執行。

如果你想執行大小,你可以使用一個struct

typedef struct 
{ 
    int items[10]; 
} TenInts; 

- (void)takeTenInts(TenInts)wrappedArray 

現在,這實際上並不在執行大小所有[*],但其接近一個可以與C家庭(「執法」一詞被詛咒)一起獲得。

如果您只想知道的大小,請將其作爲附加參數傳遞或使用NSArray

[*]的情況並不少見看到結構用C以下的圖案:

typedef struct 
{ 
    // some fields 
    int data[0]; 
} someStruct; 

這種結構是動態分配的根據它們的大小(sizeof(someStruct)足夠的額外的空間來存儲足夠整數(例如n * sizeof(int))。

換句話說,指定一個數組作爲結構的最後一個字段,而不是在任何情況下都強制實現這個數字的整數空間;可能有更多或更少的空間...

1

爲什麼在使用「NSArray」的電源(和「count」)時使用「(int *)」?

但無論如何,looking at this potentially related question,你不能只是做一個「sizeof(values)」來獲得靜態/全局分配指針的大小嗎?

如果這不起作用(這將在動態分配數組的情況下),那麼您的「doSomethingWith:」方法聲明中可能需要某種「count:」參數。

+0

因此,無法指定內存指向的大小應該是多少? – rid

+0

如果您在運行時進行分配,並且沒有將大小(或整數計數)作爲參數傳遞給該函數,則不會。 –

+0

對於NSArray(或其他高級解決方案)+1。但是,要小心'sizeof()'建議。他們可能會混淆。例如,分配數組的方式並不重要(static/global/auto vs heap)。重要的是該類型仍然是一個數組,或者它已被降級爲一個指針。在int foo [7];的範圍內,sizeof(foo)/ sizeof(foo [0])給出7,但將'foo'傳遞給函數,並且該函數不能使用sizeof來找出長度,因爲它收到了一個指針,而不是一個數組。嘗試使用'sizeof'會導致虛假結果(有效地使用'sizeof(int *)/ sizeof(int)')。 –

1

有幾種方法。你可以只命名適當的方法:

- (void)doSomethingWithTenInts:(int *)tenInts; 

或者你可以使用一個結構:

typedef struct { 
    int values[10]; 
} TenInts; 

- (void)doSomethingWithTenInts:(TenInts *)tenInts; 

或者你也可以讓用戶告訴你他是多少int小號給你:

- (void)doSomethingWithInts:(int *)ints count:(int)count;