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