如何指定方法应将指针作为参数,该指针指向内存中可以保存指定数量值的位置?例如,如果我有:
- (void)doSomethingWith:(int *)values;
我想明确指出,int *
传入的值应该指向内存中能够容纳 10 个这样的值的分配空间。
如何指定方法应将指针作为参数,该指针指向内存中可以保存指定数量值的位置?例如,如果我有:
- (void)doSomethingWith:(int *)values;
我想明确指出,int *
传入的值应该指向内存中能够容纳 10 个这样的值的分配空间。
(int *)
当你有“ ”的权力(和“ count
”)可以使用时,为什么要使用“ ” NSArray
?
但无论如何,看看这个可能相关的问题,你不能只做一个“ sizeof(values)
”来获取静态/全局分配指针的大小吗?
如果这不起作用(在动态分配数组的情况下),你真的可能需要在你的“ doSomethingWith:
”方法声明中使用某种“count:”参数。
有几种方法。您可以适当地命名该方法:
- (void)doSomethingWithTenInts:(int *)tenInts;
或者你可以使用一个结构:
typedef struct {
int values[10];
} TenInts;
- (void)doSomethingWithTenInts:(TenInts *)tenInts;
或者你可以让用户告诉你他给了你多少int
s:
- (void)doSomethingWithInts:(int *)ints count:(int)count;
要直接回答您的问题,请使用带边界的数组参数,例如:
- (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...