1

如何指定方法应将指针作为参数,该指针指向内存中可以保存指定数量值的位置?例如,如果我有:

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

我想明确指出,int *传入的值应该指向内存中能够容纳 10 个这样的值的分配空间。

4

3 回答 3

1

(int *)当你有“ ”的权力(和“ count”)可以使用时,为什么要使用“ ” NSArray

但无论如何,看看这个可能相关的问题,你不能只做一个“ sizeof(values)”来获取静态/全局分配指针的大小吗?

如果这不起作用(在动态分配数组的情况下),你真的可能需要在你的“ doSomethingWith:”方法声明中使用某种“count:”参数。

于 2012-06-09T05:43:03.703 回答
1

有几种方法。您可以适当地命名该方法:

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

或者你可以使用一个结构:

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

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

或者你可以让用户告诉你他给了你多少ints:

- (void)doSomethingWithInts:(int *)ints count:(int)count;
于 2012-06-09T05:59:28.557 回答
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))动态分配的。

In other words, specifying an array as the last field of a structure does not enforce in anyway that there is space for exactly that number of integers; there may be space for more, or fewer...

于 2012-06-09T10:05:43.273 回答