1. ホーム
  2. c

[解決済み] char*とchar**の違い(C言語)

2022-03-03 11:08:47

質問

私はこのような単純なコードを書きました。

#include <stdio.h>
#include <string.h>

void printLastLetter(char **str)
{
    printf("%c\n",*(*str + strlen(*str) - 1));
    printf("%c\n",**(str + strlen(*str) - 1));
}

int main()
{
    char *str = "1234556";
    printLastLetter(&str);
    return 1;
}

さて、文字列の最後の文字を表示したい場合、printLastLetterの最初の行が正しいコードであることは分かっています。よくわからないのは、*strと**strの違いが何なのか、ということです。最初のものは文字の配列で、2番目は? また、char *strとstr[10]のメモリ割り当ての違いは何でしょうか? ありがとうございます。

解決方法は?

char* はcharへのポインタです。 char ** はcharへのポインタへのポインタです。

char *ptr; は文字のためのメモリを確保するのではなく、char へのポインタのためのメモリを確保します。

char arr[10]; は10文字を確保し arr は最初の文字のアドレスを保持します。(ただし arr はポインタではありません(not char * という型である。 char[10] )

デモ用です。 char *str = "1234556"; のようなものです。

char *str;         // allocate a space for char pointer on the stack
str = "1234556";   // assign the address of the string literal "1234556" to str

として オーリ・チャールズワース のコメント通り、上記の例のように定数文字列へのポインタを使用する場合、ポインタの宣言は const - const char *str = "1234556"; ということで、禁止されている改造をしようとすると、セグメンテーションフォルトなどのランタイムアクセス違反エラーではなく、コンパイルタイムエラーが発生することになります。よくわからないという方は、以下をご覧ください。 こちら .

こちらもご覧ください ニュースグループ comp.lang.c の FAQ にある説明です。 .