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
所有指针的值的实际数据类型,无论是整数、浮点数、字符还是其他类型,都是相同的,一个长的十六进制数,代表同一个内存地址。
不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型。
C++ 使用指针
- #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++ 程序员应该清楚的几个重要的指针概念 -
空指针
如果没有要分配的确切地址,将指针 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
【编辑推荐】