我花了几天时间试图理解指针,但语法仍然让我感到困惑.
当你写下发言时,这个宣言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] */
Run Code Online (Sandbox Code Playgroud)
这让我认为*ip用于整数值(因为*ip声明为int),而plain 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;
}
Run Code Online (Sandbox Code Playgroud)
基于功能分配,很明显*px = &a和*py = &b,从而有效地使我的想法,只有px和py能够存储地址,不*px和*py.这让我对px&*px和py&之间的关系感到非常困惑*py.
之后我做了一些实验:
int x = 4;
int y = &x;
printf("%d %p \n",y,&y);
Run Code Online (Sandbox Code Playgroud)
...并注意到这实际上是正确编译的,尽管从十六进制转换为十进制时的值y和&y略有不同,反之亦然.
这让我比以往任何时候都更加困惑,而且很明显,无论我投入多少时间和精力,都有一些关于指针的基本概念我只是没有把握.
小智 6
这让我认为
*ip用于整数值(因为*ip声明为int),而plainip用于地址,而ip(&x)将"指向"*ip(x).换句话说,x的地址将指向x.
那就对了.究竟.
(好吧,差不多.这不是那个*ip被宣布为int,但ip被宣布为int *.这就是让你困惑的事,看下一部分.)
基于功能分配,很明显
*px = &a和*py = &b
一点都不.
px并且py是指针本身.px = &a并且py = &b,最初*px = a和*py = b(当然在交换后,这种变化).
在第二种情况下,你可能会混淆的是*角色在指针的上下文中有两个含义.
一个是,当你声明一个指针类型的变量时,该*字符充当指针限定符,即T *p表明该变量p是一个指向类型的指针T.
另一个含义是* 运算符,它不是在声明中使用,而是在表达式中使用,它取消引用指针,即它访问它指向的值.