配列ポインターの等価性は、関数の引数に対してのみ真を保持するため、とは等価ですが、関数に渡したい変数に関しては真を保持しません。void fn(const char* argv[])
void fn(const char** argv)
検討
void fn(const char** argv)
{
...
}
int main(int argc, const char* argv[])
{
fn(argv); // acceptable.
const char* meats[] = { "Chicken", "Cow", "Pizza" };
// "meats" is an array of const char* pointers, just like argv, so
fn(meats); // acceptable.
const char** meatPtr = meats;
fn(meatPtr); // because the previous call actually cast to this,.
// an array of character arrays.
const char vegetables[][10] = { "Avocado", "Pork", "Pepperoni" };
fn(vegetables); // does not compile.
return 0;
}
「vegetables」はポインターへのポインターではなく、3*10 の連続する文字シーケンスの最初の文字を直接指します。上記の fn(vegetables) を置き換えて取得します
int main(int argc, const char* argv[])
{
// an array of character arrays.
const char vegetables[][10] = { "Avocado", "Pork", "Pepperoni" };
printf("*vegetables = %c\n", *(const char*)vegetables);
return 0;
}
出力は「A」です。野菜自体は、間接的なポインターではなく、文字を直接指しています。
野菜の割り当ては、基本的にこれのショートカットです。
const char* __vegetablesPtr = "Avocado\0\0\0Pork\0\0\0\0\0\0Pepperoni\0";
vegetables = __vegetablesPtr;
と
const char* roni = vegetables[2];
に変換します
const char* roni = (&vegetables[0]) + (sizeof(*vegetables[0]) * /*dimension=*/10 * /*index=*/2);