2

文字列の配列のアドレス指定に関連する特定のトピックに関する説明を探しています。関連する問題がいくつかあるようですが、私の質問について議論した問題を見つけることができませんでした。これが以前に尋ねられた場合は、関連するスレッドを教えてください。

以下のコード スニペット (printf ステートメントを確認してください) では、同じ変数を使用して、メモリ ロケーションの値とメモリ ロケーションのアドレスにアクセスしています。これがこのコードの書き方であるかどうかはよくわかりません。アドレスまたは値にアクセスしているかどうかを明確に示すより良い方法はありますか?

char *board[NUM_MAX_ROWS] = {"0101001",
                             "1101011"};

int main()
{
    int i, num_rows=0, num_cols=0;

    num_cols = strlen(board[0]);
    num_rows = ARR_SIZE(board);

    for (i=0; i<num_rows; i++)
        printf("%s stored at %p\n", board[i], board[i]);

} 

私の最初の試みはこのように見えました

while(*board != '\0')
{
    printf("%s stored ar %p\n", *board, board);
    board++;
}

明らかにこれは機能しません:)しかし、これがコンパイラによってどのように解釈されるかについてはまだよくわかりません。

ありがとう。

4

2 に答える 2

1

ポインタを逆参照して文字列自体のアドレスを取得することで、最初の試行を行うことができます。

printf("%s stored ar %p\n", *board, *board);

ところで、配列構文を使用して記述する場合、実際には次と同じです

printf("%s stored ar %p\n", *(board+i), *(board+i));

編集:質問を読み逃したようです..修正。

于 2012-11-07T02:24:08.697 に答える
0

あなたはこのようにすることができます:

#include <stdio.h>

char *board[] = {"0101001",
                 "1101011",
                 0}; /* note this final 0 as a terminator for stopping the loop */

int main()
{
    int i, num_rows=0, num_cols=0;
    char **c;

    c = &board[0];
    while(*c)
    {
        printf("%s stored ar %p\n", *c, *c);
        c++;
    }

    return 0;
} 

ただし、その場合はループストッパーが必要です。また、わかりやすくするためNULLに代わりに使用することを提唱する人もいます。0

于 2012-11-07T02:49:04.667 に答える