指针
来源:互联网 发布:企业网站数据库设计 编辑:程序博客网 时间:2024/06/07 00:16
指针:是说指针名表示的是地址。是一个变量,存储的是值的地址,而不是值本身
*运算符被称为间接值或解除引用运算符也可以叫做取地址符
声明一个指针
int * p_data;
* p_data的类型为int 由于*运算符被用于指针,因此p_data变量本身必须是指针。
我们说p_data指向int类型,我们还说P_data的类型是指向int的指针,或int*
可以这样说p_data是指针(地 址),而*p_data是int,而不是指针
初始化指针
int value=1;
int * pt=&value;
&的作用就是取变量的地址
初始化指针就是把pt的值设置为&value,
输出
cout<<"value"<<value<<endl;
cout<<"*pt"<<*pt<<endl;
cout<<"&value"<<&value<<endl;
cout<<"pt"<<pt<<endl;
你就会发现pt和&value是一样的
*pt和value 是一样的
一般如果只是声明一个指针,可以把指针初始化等于0的指针指针为nullptr不指向任何对象
int* myValue(nullptr);
nullptr可以隐式转换为bool类型
可以这么判断
if(!myValue)
........
-----------------------------------------------------------------------------------
用new 来分配内存,程序员要告诉new 需要为哪种数据类型分配内存,new 将找到一个长度正确
的内存块,并返回该内存的地址。
int *pt =new int;
new int 告诉程序,需要适合存储Int的内存。new运算符根据类型来确定需要多少字节的内存。
然后找到这样的内存并返回地址,再把地址赋值给pt,pt被声明为指向int的指针
现在pt是地址,*pt是指向该内存的值
使用完内存后我们就要把内存归还给内存池,这就用到了delete
使用delete时要加上指向内存块的指针
int * pt=new int;
delete pt;
一定要配对的使用new 和delete,也不能释放已经释放完的内存块
也不能向下面这样释放声明变量所得的内存
int value=1;
int * pt=&value;
delete pt;//这样做是不对的
下面说一下指针创建数组
int * pt =new int[10];
new 运算符返回的是第一个元素的地址,用完后我们要用delete释放它们
delete [] pt;//[] 告诉程序应释放整个数组,而不是仅仅是指针指向的元素
使用new 和delete时,应遵守以下规则
1.不要用delete 来释放不是new分配的内存
2.不用使用delete来释放同一个内存块两次
3.如果使用new[] 为数组分配内存,则应使用delete[]释放
4.如果用new为一个实体分配内存,则应使用delete(没有[])来释放
5.对于空指针应用delete是安全的
创建数组后我们就可以用指针访问这些数组了
int * pt =new int[3]
pt[0] =1;
pt[1] =2;
pt[2] =3;
函数指针
可以使用算法的地址传递给方法,传递之前要先完成以下工作
1.获取函数的地址
2.声明一个函数指针
3.使用函数指针来调用函数
1.获取函数的地址,只要使用函数名就可以
Fun2(Fun1);
Fun2就可以在程序内部调用Fun1()函数
2.声明函数指针
声明时一定要指定指针指向的类型。同样,声明指向函数的指针时,必须指定指针指向的函数类型。
如一个函数的原型为
int Fun1(int a);
指针类型声明:
int (*pt)(int);//只是将Fun1换成了 *pt *pt 是函数, pt是函数的指针
//声明后赋值
pt = Fun1;
3.使用指针来调用函数
上面的声明说过 *pt和函数名是一样的,使用*pt和就可以调用 方法
int Fun1(int a);
int (*pt)(int);
pt = Fun1;
int _va = (*pt)(3);
也可以直接用pf
int _va=pt(3);
写一个小例子
#include<iostream>using namespace std;int MyIntF(int a);void MyIntFunP(int (*pt)(int),int va);int main(){ int (*pt)(int)=MyIntF; pt(1); MyIntFunP(MyIntF,2); cin.get();}int MyIntF(int a){ cout<<a<<endl; return a+1;}void MyIntFunP(int (*pt)(int),int va){ cout<<(*pt)(va)<<endl;}
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- Java GUI界面开发(一)JFrame的初使用
- 奇异值分解(SVD) --- 几何意义
- jquery依据自定义属性选择标签
- Android : 代码打开系统设置
- Oracle,INTERVAL DAY TO SECOND,EXTRACT (datetime)
- 指针
- 1045. 快速排序(25)
- 为类模板加上构造函数和默认构造函数
- Struct和Class的区别
- Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0
- spring boot 学习之controller
- 监听和通知
- 指针数组和数组指针
- 第9周课后实践 阅读程序,请写出这些程序的运行结果(1)