1

私はポインターを理解しようと数日を費やしてきましたが、構文はまだ私を混乱させています。

あなたが言うとき、この宣言の後のとint *ptr;の違いは何ですか?ptr*ptr

K&R では、次の例でポインターの章を開始します。

int x = 1, y = 2, z[10];
int *ip; /* ip is a pointer to int */
ip = &x; /* ip now points to x */
y = *ip; /* y is now 1 */
*ip = 0; /* x is now 0 */
ip = &z[0]; /* ip now points to z[0] */

これは、プレーンがアドレスに使用され、( ) が( ) を「指す」のに対し、 は*ip整数値に使用される ( int として宣言されているため) と考えさせられました。つまり、x のアドレスは x を指します。*ipipip&x*ipx

しかし、その考えを台無しにする例があります。

swap(&a,&b);

void swap(int *px, int *py) /* interchange *px and *py */
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}

関数の割り当てに基づいて、 and は明らか*px = &aであり、 and ではなくおよびのみがアドレスを格納できる*py = &bという私の考えを効果的に無効にします。そのため、 &と&の関係について非常に混乱しています。pxpy*px*pypx*pxpy*py

この後、いくつかの実験を行いました:

int x = 4;
int y = &x;
printf("%d %p \n",y,&y);

...そして、これは実際には正しくコンパイルされることに気付きましたが、16 進から 10 進へ、またはその逆に変換する場合、 と の値はわずかに異なりますy&y

これは私をこれまで以上に混乱させます.そして、私がどれだけの時間とエネルギーをそれに費やしても、私が把握していないポインターに関するいくつかの基本的な概念があることは明らかです.

4

1 に答える 1

7

これにより、 が*ip整数値に使用されていると考えられました (*ipは と宣言されているためint) が、プレーンipはアドレスに使用され、ip( ) は( &x) を「指す」でしょう。つまり、x のアドレスは x を指します。*ipx

それは正しい。丁度。

(まあ、ほぼ。それは として宣言されたのではなく、として*ip宣言されました。それがあなたを混乱させた理由です。次の部分を参照してください。)intipint *

機能の割り当てに基づいて、それは明確*px = &aであり、*py = &b

いいえ、まったくありません。

pxおよびpyポインター自体です。px = &apy = &b、そして最初は*px = a*py = b(もちろんスワップ後、これは変わります)。

2 番目のケースで混乱したと思われるのは、*文字がポインタのコンテキストで 2 つの意味を持つことです。

1 つは、ポインター型の変数を宣言*すると、文字がポインター修飾子として機能することです。つまりT *p、変数pが type へのポインターであることを示しますT

もう 1 つの意味は* operatorです。これは宣言ではなく式で使用され、ポインタを逆参照します。つまり、ポインタが指す値にアクセスします。

于 2013-06-16T05:44:12.630 に答える