我花了几天时间试图理解指针,但语法仍然让我感到困惑。
当你写说时,这个声明和之后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
它用于整数值(因为*ip
被声明为 int),而 plainip
用于地址,并且ip
( &x
) 将“指向” *ip
( x
)。换句话说,x 的地址将指向 x。
但随后出现了一个将这个想法抛诸脑后的例子。
swap(&a,&b);
void swap(int *px, int *py) /* interchange *px and *py */
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
基于函数分配,很明显*px = &a
and *py = &b
,这有效地打破了我的想法,即只有px
andpy
可以存储地址,而不是*px
and *py
。px
这让我对&*px
和py
&之间的关系感到非常困惑*py
。
在此之后我做了一些实验:
int x = 4;
int y = &x;
printf("%d %p \n",y,&y);
...并注意到这实际上编译正确,尽管从十六进制转换为十进制时 和 的值y
略有&y
不同,反之亦然。
这让我比以往任何时候都更加困惑,而且很明显有一些关于指针的基本概念我只是没有掌握,无论我投入了多少时间和精力。