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它用于整数值(因为*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 = &aand *py = &b,这有效地打破了我的想法,即只有pxandpy可以存储地址,而不是*pxand *pypx这让我对&*pxpy&之间的关系感到非常困惑*py

在此之后我做了一些实验:

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

...并注意到这实际上编译正确,尽管从十六进制转换为十进制时 和 的值y略有&y不同,反之亦然。

这让我比以往任何时候都更加困惑,而且很明显有一些关于指针的基本概念我只是没有掌握,无论我投入了多少时间和精力。

4

1 回答 1

7

这让我认为*ip它用于整数值(因为*ip声明为 an int),而 plainip用于地址,并且ip( &x) 将“指向” *ip( x)。换句话说,x 的地址将指向 x。

这是正确的。确切地。

(嗯,差不多。不是*ip被声明为int,而是ip被声明为int *。这让你感到困惑,请参阅下一部分。)

根据功能分配,很*px = &a清楚*py = &b

一点都不。

px并且py本身就是指针。px = &apy = &b,最初是*px = aand *py = b(当然在交换之后,这会改变)。

在第二种情况下,您可能会感到困惑的是,该*字符在指针的上下文中具有两种含义。

一种是,当你声明一个指针类型的变量时,该*字符充当指针限定符,T *p表明该变量p是一个指向 type 的指针T

另一个含义是* 运算符,它不是在声明中使用,而是在表达式中使用,它取消引用指针,即访问它指向的值。

于 2013-06-16T05:44:12.630 回答