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

eri*_*sse 1 c syntax pointers

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

当你写下发言时,这个宣言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),而plain ip用于地址,而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.

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

  • @ Amalgam54因为它不是更直观.事实上,这是误导.`int*p1,p2;`在视觉上表明`p1`和`p2`的类型是`int*`,而指针限定符适用于**变量**而不是**类型,**所以只有`p1`是一个`int*`,`p2`是一个普通的`int`.这就是为什么`int*p1,p2;`(偶尔,`int*p1,*p2;`)在概念上更正确. (2认同)