-3

誰でも次のコードを完全に説明できますか?

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int *a, *s, i;

    a = s = (int *) malloc(4 * sizeof(int));

    for (i = 0; i < 4; i++)
    {
        *(a + i) = i * 10;
        printf(" %d ", *(a + i));
    }

    printf("\n");
    printf("%d\n", *s++);
    printf("%d\n", (*s)++);
    printf("%d\n", *s);
    printf("%d\n", *++s);
    printf("%d\n", ++*s);
    printf("\n");
    printf("%d\n", *a++);
    printf("%d\n", (*a)++);
    printf("%d\n", *a);
    printf("%d\n", *++a);
    printf("%d\n", ++*a);

    return 0;
}

出力:

0 10 20 30
0
10
11
20
21

0 
11
12
21
22

*(a+i)1) for ループでのみ値が割り当てられている場合、ポインター 's' はどのように値を出力していますか?

*(a+i)2)が割り当てられたときに、値は正確にどこに保存されますか?

*s++3) 、(*s)++*++s、の違いは何++*sですか?

4) s に似たポインターを出力すると、値が 1 増えるのはなぜですか?

前もって感謝します !:)

4

4 に答える 4

2

1および2)ポインタは、特定のメモリ位置を指します(またはアドレスであると言えます)。を割り当てるa = s = (int*) malloc(4 * sizeof(int));as両方が同じアドレスを持っているか、同じメモリ位置を指しているためです。メモリの場所でコンテンツに何か変更があった場合(たとえば、コードで、割り当てられたメモリに番号を割り当てている場合)、正しいアドレス(両方が同じ場所as指している)を持っている限り、コンテンツを表示できます変更します。

大まかな例えでは、家(malloc)を要求すると、家の住所(a)が返されます。次に、家が醜いと判断し、それを再ペイントしたい場合(値を割り当て*(a + i) = i + 10ます:)、アドレスを()に伝えた他の人sは、あなたの家が再ペイントされたことを確認します。

3)

*s++現在のアドレスのコンテンツにアクセスし、後でポインタ(アドレス)をインクリメントすることを意味します。

コードを振り返ると、最初の要素にアクセスし、アドレスが2番目の要素を指します。

(*s)++現在のアドレスのコンテンツにアクセスし、後で現在のアドレスのコンテンツをインクリメントすることを意味します。

コードを振り返ると、2番目の要素のコンテンツを取得してからインクリメントします。次のprintステートメントは、インクリメントされた2番目の要素の内容を示しています。

*++sは、現在のアドレスをインクリメントし、インクリメントされたアドレスのコンテンツにアクセスすることを意味します。

コードを振り返ると、3番目の要素のコンテンツが取得されます。

++*sは、現在のアドレスでコンテンツをインクリメントし、インクリメントれたコンテンツにアクセスすることを意味します。

コードを振り返ると、3番目の要素の増分コンテンツが取得されます。

4)前の部分で説明したように、1つのポインターを介してコンテンツを変更すると、同じポインター(アドレス)を使用している場合にコンテンツが表示されます。実際には(3で説明したように)メモリアドレスの内容を変更しているため、プロセスを繰り返すと変更の効果が見られる場合があります。

于 2012-06-11T06:59:49.960 に答える
1

最初にポインタを勉強する必要があります。これが役立つかもしれません: http://www.cs.cf.ac.uk/Dave/C/node10.html

于 2012-06-11T06:47:39.950 に答える
0

1)

変数asは同じメモリ位置を指しています。

2)

と言うと、ポインタの値をその型のサイズ(1 * 4)の1倍a + 1だけインクリメントします。aしたがって、と言うと*(a+1)、次の整数から値を取得します。変数は4つの整数のサイズのメモリ位置を指しているため、変数は配列と考えることができます。次のような値にアクセスすることもできますa[0], a[1], a[2] and a[3]

3)

*s++:そのポインターの値を取得し、そのステートメントの後、ポインターsは4ずつ増加します。

`(* s)++':ポインタの値を取得し、その値を1ずつインクリメントします。

*++ss:ポインタを4インクリメントしてから、その値を取得します。

++*s:ポインタの値を取得し、s1ずつインクリメントします。

4)

ポインタsとポインタaが同じメモリ位置を指しているため、を呼び出すと*s++、そのメモリ位置の値が1つ増えます。

于 2012-06-11T06:55:58.610 に答える