-2

私のコードは以下です:

#include <stdio.h>

void print_pointer(char **str);
void print_array(char *str[20]);
void print_array2(char str[20][20]);
void print_array3(char str[][20]);

int main(int argc, char *argv[])
{
    char str[20][20] = {"test1", "test2", "test3"};

    print_pointer(str);
    print_array(str);
    print_array2(str);
    print_array3(str);

    return 0;
}

void print_pointer(char **str)
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}
void print_array(char *str[20])
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}
void print_array2(char str[20][20])
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}

void print_array3(char str[][20])
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}

このコードをコンパイルすると、次の 2 つのコンパイル エラーが発生します。

  1. error C2664: 'print_pointer' : cannot convert parameter 1 from 'char [20][20]' to 'char ** '

  2. error C2664: 'print_array' : cannot convert parameter 1 from 'char [20][20]' to 'char *[]'

私の質問は、これら 4 つの機能の実際の違いは何ですか?

print_array正常に機能しているのに、機能が機能しprint_pointerなかったのはなぜですか?print_array2print_array3

4

2 に答える 2

7

ええ、これは、配列をポインターのように扱うことができるという考えが崩れるところです。

「char[20][20]」は、20x20 形式で配置された 400 文字の配列を示します。これは、それぞれ 20 文字の配列への 20 個のポインターの配列ではありません。したがって、char[20][20] を char** にキャストするのは正しくありません (明示的にキャストすると、ガベージ結果が得られます)。

同じ理由で (char[20][20] はポインターの配列ではありません)、char *[20] にキャストすることはできません。

これ、print_array2 および print_array3 に対して宣言した配列の配列です。

于 2013-06-14T06:02:14.073 に答える