@Author:Runsen
C++ 指针学习起来有点难,但是很重要。一些 C++ 程序使用指针更容易执行,另外其他 C++ 程序,例如动态内存分配,没有指针就无法执行。
每个变量都是一个内存位置,每个内存位置都定义了其地址,可以使用与号(&)
运算符访问该地址,该运算符表示内存中的地址。
下面代码考虑以下将打印定义的变量的地址
#include <iostream>
using namespace std;
int main () {
int var1;
char var2[10];
cout << "Address of var1 variable: ";
cout << &var1 << endl;
cout << "Address of var2 variable: ";
cout << &var2 << endl;
}
输出如下
Address of var1 variable: 0x61fe1c
Address of var2 variable: 0x61fe12
在编程语言中,指针是一个变量,其值是另一个变量的地址。与任何变量或常量一样,您必须先声明一个指针,然后才能使用它。
指针变量声明的一般形式是 :
type *var-name;
这里,type是指针的类型;它必须是有效的 C++ 类型,并且var-name
是指针变量的名称。
用于声明指针的星号与用于乘法的星号相同。但是,在此语句中,星号用于将变量指定为指针。
下面是有效的指针声明
int *ip; // pointer to an integer
double *dp; // pointer to a double
float *fp; // pointer to a float
char *ch // pointer to character
所有指针的值的实际数据类型,无论是整数、浮点数、字符还是其他类型,都是相同的,一个长的十六进制数,代表同一个内存地址。
不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型。
象征 | 名称 | 描述 |
---|---|---|
&(与号) | 地址运算符 | 确定变量的地址。 |
∗(星号) | 间接运算符 | 访问地址的值。 |
#include <iostream>
using namespace std;
int main(){
int var = 5;
int *ip;
ip = &var;
cout << "变量Var的值:" << endl;
cout << var << endl;
cout << "变量Var的中存储的地址ip:" << endl;
cout << ip << endl;
cout << "访问指针中可用地址处的值:";
cout << *ip << endl;
}
具体输出如下
变量Var的值:
5
变量Var的中存储的地址ip:
0x61fe14
访问指针中可用地址处的值:5
请注意,0x0
相当于0. 它只是 的十六进制表示0。
指针有很多但很简单的概念,它们对 C++ 编程非常重要。以下是 C++ 程序员应该清楚的几个重要的指针概念 -
指针 | 说明 |
---|---|
空指针 | C++ 支持空指针,它是在几个标准库中定义的零值常量。 |
指针算术 | 有四种算术运算符可用于指针:++、--、+、- |
指针与数组 | 指针和数组之间有着密切的关系。 |
指针数组 | 您可以定义数组来保存多个指针。 |
指向指针的指针 | C++ 允许您在指针上使用指针等等。 |
将指针传递给函数 | 通过引用或通过地址传递参数都允许被调用函数在调用函数中更改传递的参数。 |
从函数返回指针 | C++ 允许函数返回指向局部变量、静态变量和动态分配的内存的指针。 |
如果没有要分配的确切地址,将指针 NULL 分配给指针变量。分配为 NULL 的指针称为空指针。
#include <iostream>
using namespace std;
int main () {
int *ptr = NULL;
cout << "The value of ptr is " << ptr ;
}
当上面的代码被编译和执行时,它会产生以下结果 -
The value of ptr is 0
在大多数操作系统上,不允许程序访问地址 0 处的内存,因为该内存是由操作系统保留的。空指针:指针变量指向内存中编号为0的空间
要检查空指针,您可以使用 if 语句如下 -
if(ptr) // succeeds if p is not null
if(!ptr) // succeeds if p is null
指针是一个地址,它也是一个数值;因此,可以像对数值一样对指针执行算术运算。有四种算术运算符可用于指针:++、--、+
和-
。
“指针++”和“指针--”表示指针所指地址的下一个或前一个数据的地址。
#include <iostream>
using namespace std;
int main()
{
int a[5];
int i;
int *p;
for(i=0; i<5; i++)
cin>>a[i];
cout<<endl;
for(i=0; i<5; i++)
cout<<a[i]<<" ";//使用数组名和下标访问的方式访问数组进行输出
for(i=0; i<5; i++)
cout<<*(a+i)<<" ";//使用数组名和指针运算访问的方式进行输出
for(p=a; p<(a+5); p++)
cout<<*p<<" ";//使用指针变量访问的方式进行输出
return 0;
}
运行结果
1
2
3
4
5
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5