我什么时候应该使用*和什么时候?

时间:2016-01-23 12:37:55

标签: c++ pointers

我正在学习一些C ++,我遇到了指针和地址。但是,在所有材料中,我都能找到关于何时使用指针以及何时使用地址的良好解释。据我所知,当我使用指针时,我要在内存中寻址,其中存储了一些变量。例如:

string = "t e s t  t e s t"
string = string.replace('  ', ' ').replace(' ', '')
print (string)

这意味着:

int x = 5;
int k* = &x;

当我更改k represents x 时,我也会更改k的值。

我的问题如下:我何时应该使用指针,何时应该使用地址?当我声明一个函数时,我应该使用指针或地址作为变量吗?

3 个答案:

答案 0 :(得分:3)

你有一个错字。它应该是:

int x = 5;
int *k = &x;

应该理解为: k指向x 。或者,如果您坚持使用“代表”字词: *k代表x

&运算符将任何变量作为参数并返回其地址(指针)。 *获取指针(地址)作为参数,并返回存储在那里的值。因此,它们是相反的操作:&*kk相同,同样*&xx相同。你可以这样看待这些表达式:

x //an integer
k //pointer to integer
&x //pointer to x
*k //integer pointed to by k
*&x //integer pointed to by a pointer to x, that is x
&*k //pointer to the integer pointed to by k, that is k

请注意,运算符&只能用于变量,因为表达式通常没有地址,只有变量(井和临时,但这是另一回事)。例如,此表达式无效:

&(x + 1) //error!

这些运算符最有趣的事情是如何声明指针:

int *k;

你可能会认为它更好地写成int &k,但这不是如何在C ++中读取声明符。相反,该声明应理解为:

int (*k);

也就是说,*k是一个整数,因此k是指向整数的指针。

现在,初始化的声明是更奇怪的:

int *k = &x;

实际上应该被理解为:

int (*k);
k = &x;

也就是说,将*k声明为整数,因此k是指向整数的指针。然后使用k的地址初始化x(指针)。

实际上你可以创建任何类型的指针,甚至是指针的指针,指向指针的指针......但请注意,这种语法是非法的:

int x;
int **p = &&x; //error, &x is not a variable

但这是有效的:

int x;
int *k = &x;
int **p = &k;

答案 1 :(得分:1)

如果变量存储内存位置的地址,则会将其视为指针。因此,int *例如存储int - 变量的地址。通过使用解除引用运算符*,您可以访问指针地址处的内存位置并分配给它。

要获取变量的地址,请使用 & - 运算符。这就是你的例子。要分配到存储x的内存位置,您可以再次使用derefence-operator:*k = 0;

请注意,derefence-operator和表达指针类型的*是两个不同的东西。 *&是彼此相反的(超载)运算符,而int *是一种类型。

特别是在C ++中,如果&与类型一起使用,则变量的类型是引用类型,例如const string &s。就像指针类型一样,这与address-of运算符不同。引用类型不需要使用*解除引用,但会直接修改它们引用的内存位置。

答案 2 :(得分:0)

只要您想指向变量,就会使用指针运算符(*)

只要指向变量的内存地址,就会使用地址运算符(&)