指定した数の値を保持できるメモリ内の場所へのポインターをメソッドがパラメーターとして受け取るように指定するにはどうすればよいですか? たとえば、私が持っている場合:
- (void)doSomethingWith:(int *)values;
int *
渡された は、そのような値を 10 個保持できるメモリ内の割り当てられたスペースを指す必要があることを明確にしたいと思います。
指定した数の値を保持できるメモリ内の場所へのポインターをメソッドがパラメーターとして受け取るように指定するにはどうすればよいですか? たとえば、私が持っている場合:
- (void)doSomethingWith:(int *)values;
int *
渡された は、そのような値を 10 個保持できるメモリ内の割り当てられたスペースを指す必要があることを明確にしたいと思います。
質問に直接答えるには、境界のある配列引数を使用します。
- (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)
ます。
つまり、配列を構造体の最後のフィールドとして指定しても、正確にその数の整数のためのスペースがあることは強制されません。より多くの、またはより少ないスペースがあるかもしれません...
(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;