我正在学习一些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
的值。
我的问题如下:我何时应该使用指针,何时应该使用地址?当我声明一个函数时,我应该使用指针或地址作为变量吗?
答案 0 :(得分:3)
你有一个错字。它应该是:
int x = 5;
int *k = &x;
应该理解为: k
指向x
。或者,如果您坚持使用“代表”字词: *k
代表x
。
&
运算符将任何变量作为参数并返回其地址(指针)。 *
获取指针(地址)作为参数,并返回存储在那里的值。因此,它们是相反的操作:&*k
与k
相同,同样*&x
与x
相同。你可以这样看待这些表达式:
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)
只要您想指向变量,就会使用指针运算符(*)。
只要指向变量的内存地址,就会使用地址运算符(&)。