C++ 指针总结

指针是整个C++的精髓所在,只有精通了指针才可以说是掌握了C++,可以说学习C++的过程是个熟练掌握和使用指针的过程
指针的几个形式:
int* ptr    //整型指针
char** ptr    //字符型的指向指针的指针
int* ap[15]    //整型的指针数组,拥有15个指针元素
int (*fp)(char*)    //函数指针 形参是字符指针

指针的定义
 指针就是地址,定义一个指针的时候可以初始化也可以在随后再初始化
 在指针定义的时候的*表示后面的是指针,而在程序运行执行的过程中的*是一个指针运算符,*p表示指针p指向的变量

指针的运算
y=*p++等同于y=*(p++)
y=*++p等同于y=*(++p)

指针初始化
int *p=0等价于int *p=NULL
如果所在的编译器不支持NULL,那么可以自定义NULL:const int NULL=0

尽量的使用new和delete操作
malloc和free对于构造函数和析构函数一无所知,所以我们应该尽量的使用new和delete操作
string* stringptr=new string[10]
delete[] stringptr;

多重指针的使用
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来删除一个数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值