指向指定数量的值的指针

时间:2012-06-09 05:33:27

标签: objective-c pointers

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

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

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

3 个答案:

答案 0 :(得分:1)

为什么在使用“(int *)”功能(和“count”)时使用“NSArray”?

但无论如何,looking at this potentially related question,你不能只用“sizeof(values)”来获得静态/全局分配指针的大小吗?

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

答案 1 :(得分:1)

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

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

或者您可以使用结构:

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

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

或者你可以让用户告诉你他给你多少int

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

答案 2 :(得分: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系列接近(对于“强制执行”这个词来说是诅咒)。< / p>

如果您只想知道的大小,请将其作为附加参数传递或使用NSArray

[*]在模式中看到C中的结构并不罕见:

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

此类结构根据其大小(sizeof(someStruct)加上动态分配,以存储足够的整数(例如n * sizeof(int))。

换句话说,将数组指定为结构的最后一个字段强制执行,确实存在完全相同数量的整数的空间;可能有更多或更少的空间...