私はポインターを理解しようと数日を費やしてきましたが、構文はまだ私を混乱させています。
あなたが言うとき、この宣言の後のと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 を指します。*ip
ip
ip
&x
*ip
x
しかし、その考えを台無しにする例があります。
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
という私の考えを効果的に無効にします。そのため、 &と&の関係について非常に混乱しています。px
py
*px
*py
px
*px
py
*py
この後、いくつかの実験を行いました:
int x = 4;
int y = &x;
printf("%d %p \n",y,&y);
...そして、これは実際には正しくコンパイルされることに気付きましたが、16 進から 10 進へ、またはその逆に変換する場合、 と の値はわずかに異なりますy
。&y
これは私をこれまで以上に混乱させます.そして、私がどれだけの時間とエネルギーをそれに費やしても、私が把握していないポインターに関するいくつかの基本的な概念があることは明らかです.