指针是整个C++的精髓所在,只有精通了指针才可以说是掌握了C++,可以说学习C++的过程是个熟练掌握和使用指针的过程
指针的几个形式:
int* ptr //整型指针
char** ptr //字符型的指向指针的指针
int* ap[15] //整型的指针数组,拥有15个指针元素
int (*fp)(char*) //函数指针 形参是字符指针
1 指针的定义
指针就是地址,定义一个指针的时候可以初始化也可以在随后再初始化
在指针定义的时候的*表示后面的是指针,而在程序运行执行的过程中的*是一个指针运算符,*p表示指针p指向的变量
2 指针的运算
y=*p++等同于y=*(p++)
y=*++p等同于y=*(++p)
3 指针初始化
int *p=0等价于int *p=NULL
如果所在的编译器不支持NULL,那么可以自定义NULL:const int NULL=0
4 尽量的使用new和delete操作
malloc和free对于构造函数和析构函数一无所知,所以我们应该尽量的使用new和delete操作
string* stringptr=new string[10]
delete[] stringptr;
5 多重指针的使用
char* str[]={"www.","jiaojiaoni.","com"};
char** pc[]={str+2,str+1,str};
下面根据例子比较指针的使用:
#include <iostream>
using namespace std;
int* ptr;
void dosomething(){
int number=25;
ptr=&number;
}
int main(){
dosomething();
cout<<"#####"<<*ptr<<endl;
}
运行的时候ptr的值输出的不是25,哇咔咔,这里就是需要注意的地方,在dosomething的函数里面,number是局部变量,局部变量在函数结束的时候会被删除,number被删除了,但是ptr还指向该内存空间,因此就会出错得不到number的值了,如果需要在dosometing中赋值的话可以使用动态分配技术:
#include <iostream>
using namespace std;
int* ptr;
void dosomething(){
ptr=new int;
*ptr=25;
}
int main(){
dosometing();
cout<<"#####"<<*ptr<<endl;
}
上面这个问题可以正常使用了,但是存在一个严重的问题,就是内存回收的问题,函数执行完毕后没有对内存进行处理,怎么办?动态分配的内存不会自动删除的,这个内存 块会一直存在,直到电脑重启,这样多郁闷啊?所以在使用完后需要显示的调用delete ptr来删除指针
指向类的指针的使用:
Myclass* cptr=new Myclass;
cptr->...
...
delete cptr;
指向数组的指针的使用:
int Arr[3]={1,2,3};
int *iptr=&Arr[0];//这里的&Arr[0]也可以简写成Arr,都表示的是数组的第一个元素
int* pArr=new int[6];
在使用指针访问数组的时候,可以使用++使指针指向下一个数组的元素
对于分配的指针数组,别忘记了回收回来:
delete[] pArr; //删除整个数组而不是一个元素
指针总结:
指针是一个指向内存区域的变量,定义的时候在变量的前面加上星号*
我们可以得到一个变量的地址,使用&就可以了
我们可以使用new关键字动态分配内存,指针的类型必须和它所指的变量类型一样
必须用delete删除动态分配的内存
可以使用&Arr[0]或者Arr获得第一个数组元素的地址来
可以使用delete[] Arr来删除一个数组
C++ 指针总结
最新推荐文章于 2022-11-10 17:18:07 发布