1
#include<stdio.h>
int main()
{
    int *p=0;
    char *ch=0;
    p++;
    ch++;
    printf ("%d and %d\n",p,ch);
    return 0;
}

出力:

4 and 1
  1. char ポインターも、それが指しているアドレスで +1 としてインクリメントされることを知っています。

  2. int へのポインターは、それが指している gcc のアドレスでも +4 としてインクリメントされることを知っています。

  3. ポインターを参照解除するには、ポインターで * を使用する必要があることを知っています。

クエリ:

  1. どちらもポインターであり、アドレスが割り当てられていないため、これが p と ch にガベージ値を与えないのはなぜですか。

  2. これにより、インクリメント中にそれぞれのポインターが取得したアドレスの違いが得られるのはなぜですか、またはこれは未定義の動作です。

3.出力が 4 と 1 なのはなぜですか?

Pl。説明。

このコードは gcc-4.3.4 でコンパイルしました。そのCコードです。スタックオーバーフローでそのような質問を見つけることができなかったので、これがいくつかの質問のコピーであることが判明した場合は申し訳ありません。

4

3 に答える 3

3

1.どちらもポインターであり、アドレスが割り当てられていないため、pとchにガベージ値が与えられないのはなぜですか。

エラー、ここにアドレスを割り当てました >int *p = 0char *ch = 0. pアドレス0x00000000ch含み、アドレスを含む0x00000000

2.これにより、インクリメント中にそれぞれのポインターが取得したアドレスの違いが得られるのはなぜですか、またはこれは未定義の動作ですか。

char *ch = 0;chはアドレスを含むことを意味します0。を使用してアドレスを++インクリメントすると、値が だけインクリメントされsizeof(char) viz 1ます。整数についても同様です。pアドレス 0 が含まれています。また、++演算子を使用すると、マシン上sizeof(int)にあるように見える値がインクリメントさ4れます (特に 64 ビット マシンの場合、これは常に正しいとは限りません)。

3.なぜこの出力は 4 1 なのですか? ここ

最初はp0が含まれていたため、マシン上でsizeof(type_of(p))= sizeof(int)=ずつ増加し、= = 1ずつ増加します。4chsizeof(type_of(ch))sizeof(char)

于 2012-11-07T03:56:15.460 に答える
2

まず、コードはポインターを整数として出力しています。これはおそらくあなたがやろうとしていることですが、ポインターのサイズ (バイト単位) が のサイズと同じではないプラットフォームでは完全に移植できないため、定義された動作ではありませんint。ポインター値を出力したい場合は、%p代わりに使用してください。

ご質問にお答えします。両方のポインターに値を割り当てています: 0はNULL同義です。

2番。4 1 が得られる理由は、プラットフォーム上intの のサイズと のサイズによるものです。charchar は 1 になります。あなたのプラットフォームでは、anintは 4 バイト幅です。ポインターをインクリメントすると、コンパイラーは、参照するアドレスを、それが表す基になる型のバイト数だけ自動的に移動します。

#include<stdio.h>
int main()
{
    int *p=0;    // int is 4 bytes on your platform
    char *ch=0;  // char is 1 byte
    p++;         // increments the address in p by 4
    ch++;        // increments the address in ch by 1
    printf ("%d  and %d\n",p,ch);
    return 0;
}

編集: 同様の結果が得られますが、サポートされている print ステートメントを使用して、代わりに次のようにします。

#include<stdio.h>
int main()
{
    int *p=0;
    char *ch=0;
    p++;
    ch++;
    printf ("%p and %p\n",p,ch);
    return 0;
}

出力(私のMac上)は次のとおりです。

0x4 and 0x1
于 2012-11-07T03:57:38.907 に答える
0

私の知る限り、あなたの質問への回答をインラインで追加しました:

#include<stdio.h>
int main()
{
    int x=0,*p=0;
    char c = 'A', *ch=0;
    x++; 

    // You have initialized this to 0, so incrementing adds 4 (int pointer)
    // Remember, the address '4' means nothing here
    p++; 

    // You have initialized this to 0, so incrementing adds 1 (char pointer)
    // Remember, the address '1' means nothing here
    ch++;

    // You are now printing the values of the pointers itself
    // This does not make any sense. If you are using pointers, you would want to know what is being referenced
    printf ("%d , %d  and %d\n",x,p,ch); 

    // This will FAIL
    // Because, you are now trying to print the data pointed by the pointers
    // Note the use of '*'. This is called de-referencing
    printf ("%d , %d  and %d\n", x, *p, *ch); 

    // Let p point to x, de-referencing will now work
    p = &x;
    printf ("%d , %d\n", x, *p); // 1, 1

    // Let ch point to c, de-referencing will now work
    ch = &c;
    printf ("%c , %c\n", c, *ch); // 'A', 'A'

    return 0;
}

お役に立てれば。

于 2012-11-07T03:41:28.807 に答える