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

时间:2013-06-16 05:35:46

标签: c pointers syntax

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

当您写下{,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({{ 1}})将“指向”&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 = &bpx可以存储地址,而不是{{1} }和py。这使我对*px和&之间的关系感到非常困惑。 *pypx& *px

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

py

...并注意到这实际上是正确编译的,尽管*pyint x = 4; int y = &x; printf("%d %p \n",y,&y); 的值在从十六进制转换为十六时略有不同,反之亦然。

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

1 个答案:

答案 0 :(得分:6)

  

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

这是对的。准确。

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

  

根据功能分配,明确int **px = &a

不,完全没有。

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

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

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

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