C++ 指针
第二章 C++指针
1.指针的概念
指针的作用: 可以通过指针间接访问内存
-
内存编号是从0开始记录的,一般用十六进制数字表示
-
可以利用指针变量保存地址
2.指针变量的定义和使用
指针变量和普通变量的区别
- 普通变量存放的是数据,指针变量存放的是地址
- 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用
void definitionPointer(){
int a=10;
int *p;
//指针指向变量a的地址
p=&a;
cout<<p<<endl;
cout<<&a<<endl;
/**
* 通过*操作指针变量指向的内存
* 也就是*p是a的值
*/
cout<<"*P="<<*p<<endl;
}
小结:
我们可以通过 & 符号 获取变量的地址
利用指针可以记录地址
对指针变量解引用,可以操作指针指向的内存
3.指针所占内存空间
void spacePointer(){
cout<< sizeof(char *)<<endl;
cout<< sizeof(string *)<<endl;
cout<< sizeof(float *)<<endl;
cout<< sizeof(int *)<<endl;
}
小结:指针在32位操作系统下是4字节;在64位系统下是8字节。
4.空指针和野指针
空指针:指针变量指向内存中编号为0的空间,空指针指向的内存是不可以访问的。
野指针:指针变量指向非法的内存空间
//debug运行
void errorPointer(){
//指针变量p指向内存地址编号为0的空间
int *p=NULL;
//访问空指针报错
*p=100;
//内存编号0 ~255为系统占用内存,不允许用户访问
cout<<"*P="<<*p<<endl;
//指针变量p指向内存地址编号为0x1100的空间
int * q = (int *)0x1100;
//访问野指针报错
cout << *q << endl;
}
5.指针、数组、函数
利用指针遍历数组
void arrayPointer(){
int arr[]={1,2,3,4,5,6};
int *p=arr;//p指向arr数组的首地址
if(*p==arr[0]){
cout << "hello world!" << endl;
}
for (int i = 0; i < ARRAY_SIZE(arr); i++)
{
//利用指针遍历数组
cout << *p << endl;
p++;
}
}
利用指针作函数参数,可以修改实参的值
void swapPinter(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
cout << "a="<<*a << endl;
cout << "b="<<*b << endl;
}
6.指针函数和函数指针
指针函数: 本质上是一个函数,返回值为指针。
//定义
类型 *指针变量名(参数列表);
exp:
int *func(int &a){
a=1000;
return (int *)&a;
}
int main(){
int i=10;
int *a=func(i);//用一个指针变量接收func函数的返回值
cout << *a;
}
函数指针: 本质是一个指针,函数指针就是指向代码段中函数入口地址的指针。
类型 (*指针变量名)(参数列表);
exp:
int cfun(int &a){
a=10000;
return a;
}
int main() {
int j=10;
int (*p)(int &)=cfun;//定义函数指针并初始化
int result=p(j);//调用函数指针
cout<<result;
}