C/C++指针解引用

3
如果我有以下函数...
void function(double *array)
{
    double a = array[3]; // Method 1
    double b = *(array + 3); // Method 2
}

假设这个数组有5个元素(我知道数组的长度)。 代码可以成功编译并运行,'a'和'b'的值符合预期。
在什么情况下我会使用方法2而不是方法1?

[]是数组的语法糖(或者将指针视为数组)。*解引用指针,而+取一个指针和一个整数值,返回一个偏移了该数量的指针。这只是C++规则的一个例子。 - payo
太好了!感谢你的回答! - DanielS
有时候我会在不使用 * 的情况下使用方法2,当我需要将结果存储在指针中时。 - Neil Kirk
2
请注意,由于这两个定义是等效的,因此 3[array] 也是有效的,并且等同于 array[3] - avakar
显示剩余3条评论
2个回答

5

E1[E2]在C语言中的定义为(*((E1) + (E2))),二者等价。

建议优先使用第一种写法,因为它更加简短易读。


0

两者都是一样的。这就像问哪种方法更好地访问在堆上分配的结构成员:

#include <stdio.h>
#include <stdlib.h>

struct s { int a;};
int main(void)
{
    struct s* x = malloc(sizeof(struct s));
    x->a = 2;  //method 1 OR
    printf("%d\n",x->a);
    (*x).a = 3;  //method 2
    printf("%d\n",(*x).a);
    free(x);
    return 0;
}

所以使用[]->运算符。了解它们的实际工作方式(解引用指针并添加偏移量以到达正确的地址)是很好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接