指针语法混乱(* ptr vs ptr)

我花了几天时间试图理解指针,但语法仍然让我感到困惑。

写的时候说, 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),而普通ip用于地址, ip&x )将“指向” *ipx )。 换句话说,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*py = &b ,这有效地打败了我的想法,即只有pxpy可以存储地址,而不是*px*py 。 这让我对px*pxpy*py之间的关系感到非常困惑。

之后我做了一些实验:

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

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

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

这让我觉得*ip用于整数值(因为*ip被声明为int ),而普通ip用于地址, ip&x )将“指向” *ipx )。 换句话说,x的地址将指向x。

那就对了。 究竟。

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

基于function分配,很明显*px = &a*py = &b

一点都不。

pxpy本身就是指针。 px = &apy = &b ,最初*px = a*py = b (当然在交换后,这会发生变化)。

在第二种情况下,你可能会混淆的是*字符在指针的上下文中有两个含义。

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

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