指针语法混乱(* 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
)将“指向” *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
和*py = &b
,这有效地打败了我的想法,即只有px
和py
可以存储地址,而不是*px
和*py
。 这让我对px
& *px
和py
& *py
之间的关系感到非常困惑。
之后我做了一些实验:
int x = 4; int y = &x; printf("%d %p \n",y,&y);
…并注意到这实际上是正确编译的,尽管y
和&y
的值在从hex转换为十进制时略有不同,反之亦然。
这让我比以往任何时候都更加困惑,而且很明显,无论我投入多少时间和精力,都有一些关于指针的基本概念我只是没有把握。
这让我觉得
*ip
用于整数值(因为*ip
被声明为int
),而普通ip
用于地址,ip
(&x
)将“指向”*ip
(x
)。 换句话说,x的地址将指向x。
那就对了。 究竟。
(好吧,差不多。不是*ip
被声明为int
,而是ip
被声明为int *
。这让你感到困惑,请看下一部分。)
基于function分配,很明显
*px = &a
和*py = &b
一点都不。
px
和py
本身就是指针。 px = &a
和py = &b
,最初*px = a
和*py = b
(当然在交换后,这会发生变化)。
在第二种情况下,你可能会混淆的是*
字符在指针的上下文中有两个含义。
一个是,当你声明一个指针类型的变量时, *
字符充当指针限定符,即T *p
表示变量p
是指向类型T
的指针。
另一个含义是*
运算符 ,它不在声明中使用,而是在表达式中使用,它取消引用指针,即它访问它指向的值。