1

指定した数の値を保持できるメモリ内の場所へのポインターをメソッドがパラメーターとして受け取るように指定するにはどうすればよいですか? たとえば、私が持っている場合:

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

int *渡された は、そのような値を 10 個保持できるメモリ内の割り当てられたスペースを指す必要があることを明確にしたいと思います。

4

3 に答える 3

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)ます。

つまり、配列を構造体の最後のフィールドとして指定しても、正確にその数の整数のためのスペースがあることは強制されません。より多くの、またはより少ないスペースがあるかもしれません...

于 2012-06-09T10:05:43.273 に答える
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;

intまたは、ユーザーに s の数を教えてもらうこともできます。

- (void)doSomethingWithInts:(int *)ints count:(int)count;
于 2012-06-09T05:59:28.557 に答える