1
#include<stdio.h>
main()
{

        char c = 'R';
        printf("%c\n",c);
        c++;
        printf("%c\n",c);
        char *ptr ="Ramco Systems";
        printf("%c\n",(*ptr));
        (*ptr)++;
        printf("%d\n",(*ptr));

}

最初、2番目、3番目のprintfの出力は、「R」、「S」、および「R」です(予想どおり)。ただし、「(*ptr)++;」という行は 実行時エラーが発生します。誰かが理由を説明できますか?

4

4 に答える 4

5

その理由は、指すメモリがptrコンパイル時に設定され、変更できないためです。

したがって、経由で最初の文字にアクセスすること*ptrは問題なく、 を返しますRが、最初の文字をインクリメントしようとすると、コンパイル時に提供する文字列を変更することが許可されていないため、実行時エラーが発生します。

以下の Seg Fault のコメントを拡張するには、コードを記述するより良い方法は次のとおりです。

const char *ptr ="Ramco Systems"; //pointer to const char
(*ptr)++; // yields compiletime error because *ptr is a const char

この新しいコードでは、宣言されたポインター型がより正確になり、その結果、コンパイラーが 2 行目にコンパイル時エラーを出すことができることに注意してください (実行時エラーよりもはるかに優れています)。

于 2012-10-21T16:54:37.050 に答える
0

char * ptr = "Ramco Systm"

上記のステートメントは定数へのポインタになり、無効なコンテンツを変更しようとしていますが、コンパイル時にコンパイラでエラーをスローする場合は、次のように使用/書き込みできます。const char * ptr = "Ramco System"

上記のステートメントは同じように動作します。唯一の違いは、(* ptr)++を書き込むと、「読み取り専用の場所の変更」などのコンパイル時エラーが発生することです。手に

于 2012-10-21T17:04:29.510 に答える
0

多分あなたはこのようなことをしようとしていますか?

  #include<stdio.h>
  main()
  {

    char c = 'R';
    printf("%c\n",c);
    c++;
    printf("%c\n",c);
    char aux[] = "Ramco Systems";
    char *p = aux;
    printf("%c\n",(*ptr));
    (*ptr)++;
    printf("%d\n",(*ptr));

}

ただし、逆参照してからインクリメントする次の行を覚えておいてください。

    (*ptr)++;

したがって、次のように動作します。「私が指している文字は何ですか?わかりました。この文字を次の文字に変更します(ASCIIコードが1単位上の文字)」この場合、「R」を「S」に変更します。

'a'を指す場合は、次のようにします。

  ptr++;

これを行うことにより、ptrが指すアドレスを1つインクリメントし、次の文字を指すように渡します。

于 2012-10-21T17:46:04.457 に答える
0

(*ptr)++する必要があります*(ptr++)

ptr最初の文字を指す

(*ptr)実際の値を返します

(*ptr)++エラーの原因は、割り当てもインクリメントもできない右辺値(あなたの場合)を(*ptr)返します。また、変更できない定数(c ++の定数ではない)文字を指します!Rptr

最初にインクリメントptrしてからdereference、つまり*(ptr++)

誤解

のような文字列リテラル"xyz"は常にCcharのように扱われますが、できません。他の人が主張するように宣言されていないか、定数です。変更が許可されていないか、定義されていません。modifiedconst

C ++では、 文字列リテラルconstは、変更できないcharとして表されます。

于 2012-10-21T17:04:54.980 に答える