📅  最后修改于: 2020-09-25 05:06:50             🧑  作者: Mango
在C++中,指针是存储其他变量的内存地址的变量。
如果程序中有变量var
,则&var
将在内存中提供其地址。例如,
#include
using namespace std;
int main()
{
// declare variables
int var1 = 3;
int var2 = 24;
int var3 = 17;
// print address of var1
cout << "Address of var1: "<< &var1 << endl;
// print address of var2
cout << "Address of var2: " << &var2 << endl;
// print address of var3
cout << "Address of var3: " << &var3 << endl;
}
输出
Address of var1: 0x7fff5fbff8ac
Address of var2: 0x7fff5fbff8a8
Address of var3: 0x7fff5fbff8a4
在此, 0x
表示地址为十六进制格式。
请注意,第一个地址与第二个地址相差4个字节,第二个地址与第三个地址相差4个字节。
这是因为在64位系统中, int
变量的大小为4个字节。
注意:运行程序时,您可能不会获得相同的结果。
如上所述,指针用于存储地址而不是值。
这是我们如何声明指针的方法。
int *pointVar;
在这里,我们声明了一个int
类型的指针pointVar
。
我们还可以通过以下方式声明指针。
int* pointVar; // preferred syntax
让我们再举一个声明指针的例子。
int* pointVar, p;
在这里,我们声明了一个指针pointVar
和一个普通变量p
。
注意:在数据类型之后使用*
运算符来声明指针。
这是我们如何为指针分配地址:
int* pointVar, var;
var = 5;
// assign address of var to pointVar pointer
pointVar = &var
在此,将5
分配给变量var
。并且,使用代码pointVar = &var
将var
的地址分配给pointVar
指针。
为了获得指针指向的值,我们使用*
运算符。例如:
int* pointVar, var;
var = 5;
// assign address of var to pointVar
pointVar = &var
// access value pointed by pointVar
cout << *pointVar << endl; // Output: 5
在上面的代码中,var的地址分配给pointVar
。我们已经使用*pointVar
来获取存储在该地址中的值。
当*
与指针一起使用时,它称为取消引用运算符 。它对指针进行操作,并给出指针中存储的地址所指向的值。也就是说, *pointVar = var
。
注意:在C++中, pointVar
和*pointVar
完全不同。我们不能做类似*pointVar = &var;
#include
using namespace std;
int main() {
int var = 5;
// declare pointer variable
int* pointVar;
// store address of var
pointVar = &var
// print value of var
cout << "var = " << var << endl;
// print address of var
cout << "Address of var (&var) = " << &var << endl
<< endl;
// print pointer pointVar
cout << "pointVar = " << pointVar << endl;
// print the content of the address pointVar points to
cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl;
return 0;
}
输出
var = 5
Address of var (&var) = 0x61ff08
pointVar = 0x61ff08
Content of the address pointed to by pointVar (*pointVar) = 5
如果pointVar
指向var
的地址,则可以使用*pointVar
更改var
的值。
例如,
int var = 5;
int* pointVar;
// assign address of var
pointVar = &var
// change value at address pointVar
*pointVar = 1;
cout << var << endl; // Output: 1
这里, pointVar
和&var
具有相同的地址,当更改*pointVar
时, var
的值也将更改。
#include
using namespace std;
int main() {
int var = 5;
int* pointVar;
// store address of var
pointVar = &var
// print var
cout << "var = " << var << endl;
// print *pointVar
cout << "*pointVar = " << *pointVar << endl
<< endl;
cout << "Changing value of var to 7:" << endl;
// change value of var to 7
var = 7;
// print var
cout << "var = " << var << endl;
// print *pointVar
cout << "*pointVar = " << *pointVar << endl
<< endl;
cout << "Changing value of *pointVar to 16:" << endl;
// change value of var to 16
*pointVar = 16;
// print var
cout << "var = " << var << endl;
// print *pointVar
cout << "*pointVar = " << *pointVar << endl;
return 0;
}
输出
var = 5
*pointVar = 5
Changing value of var to 7:
var = 7
*pointVar = 7
Changing value of *pointVar to 16:
var = 16
*pointVar = 16
假设我们想要一个指针varPoint
指向var
的地址。然后,
int var, *varPoint;
// Wrong!
// varPoint is an address but var is not
varPoint = var;
// Wrong!
// &var is an address
// *varPoint is the value stored in &var
*varPoint = &var
// Correct!
// varPoint is an address and so is &var
varPoint = &var
// Correct!
// both *varPoint and var are values
*varPoint = var;
推荐读物 :