1.指针定义和初始化
2.指向数组的指针
指针数组
指针定义
类型 * ptr = xxx;
指针运算 * 寻址过程,根据地址找到内存单元,然后把里面的值给取出来。
取地址运算 &
指针变量的初始化
-
语法形式
存储类型 数据类型 *指针名=初始地址;
-
例:
int *pa = &a;
-
注意事项
-
用变量地址作为初值时,该变量必须在指针初始化之前已声明过,且变量类型应与指针类型一致。
-
可以用一个已有合法值的指针去初始化另一个指针变量。
-
不要用一个内部非静态变量去初始化 static 指针。
-
指针变量的赋值运算
-
语法形式
指针名=地址
注意:“地址”中存放的数据类型与指针类型必须相符
-
向指针变量赋的值必须是地址常量或变量,不能是普通整数,例如:
-
通过地址运算“&”求得已定义的变量和对象的起始地址
-
动态内存分配成功时返回的地址
-
-
例外:整数0可以赋给指针,表示空指针。
-
允许定义或声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。
例: void *general;
思考一下为什么可以定义void * ptr,
答案: 因为这个指针本身占4个字节,void表示它指向的地址的内存单元占多少个字节不知道。但是ptr本身是存放地址的,在32位系统里占4个字节。64位系统里占8个字节。
void * ptr被初始化的时候,会告诉它 ptr所指向内存单元占几个字节。这里定义的时候,可以不用知道,所以是void类型。在初始化时候,知道就可以了。
指针空值nullptr
-
以往用0或者NULL去表达空指针的问题:
-
C/C++的NULL宏是个被有很多潜在BUG的宏。因为有的库把其定义成整数0,有的定义成 (void*)0。在C的时代还好。但是在C++的时代,这就会引发很多问题。
-
-
C++11使用nullptr关键字,是表达更准确,类型安全的空指针
例6-5 指针的定义、赋值与使用
//6_5.cpp
#include <iostream>
using namespace std;
int main() {
int i; //定义int型数i
int *ptr = &i; //取i的地址赋给ptr
i = 10; //int型数赋初值
cout << "i = " << i << endl; //输出int型数的值
cout << "*ptr = " << *ptr << endl; //输出int型指针所指地址的内容
return 0;
}
运行结果:
i = 10
*ptr = 10
例6-6 void类型指针的使用
#include <iostream>
using namespace std;
int main() {
//!void voidObject; 错,不能声明void类型的变量
void *pv; //对,可以声明void类型的指针
int i = 5;
pv = &i; //void类型指针指向整型变量
int *pint = static_cast<int *>(pv); //void指针转换为int指针
cout << "*pint = " << *pint << endl;
return 0;
}
指向常量的指针
-
不能通过指向常量的指针改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
-
例
int a;
const int *p1 = &a; //p1是指向常量的指针
int b;
p1 = &b; //正确,p1本身的值可以改变
*p1 = 1; //编译时出错,不能通过p1改变所指的对象
指针类型的常量
-
若声明指针常量,则指针本身的值不能被改变。
-
例
int a;
int * const p2 = &a;
p2 = &b; //错误,p2是指针常量,值不能改变