c++ 指针(一)
指针:是说指针名表示的是地址。是一个变量,存储的是值的地址,而不是值本身
*运算符被称为间接值或解除引用运算符也可以叫做取地址符
声明一个指针
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;
使用指针符号可以处理数组中的数据,相应的执行速度往往比使用数组符号要快
c++ 指针(一)的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- c 数组与指针的使用注意事项
数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
随机推荐
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- PMBOK学习笔记一
项目管理就是将知识.技能.工具与技术应用于项目活动,以满足项目的要求.为了实现对这些知识的应用,需要对项目管理过程进行有效管理 为了取得项目成功,项目团队应该:. 选择适用的过程来实现项目目标:. 使 ...
- asp.net之treeview无法显示树结点图标(IP与域名的表现竟不一样)
背景 今天接到客户的电话,说部署上去的项目树型的treeview无法正常显示,显示成了好几个大红叉.如: 排查 于是我通过远程登录到服务器,在本地测试了一会发现没有这个问题存在,无论是通过IP ...
- ADO.Net(三)——数据库操作类
操作数据类 避免代码重用.造对象太多.不能分工开发 利用面向对象的方法,把数据访问的方式优化一下,利用封装类 一般封装成三个类: 1.数据连接类 提供数据连接对象 需要引用命名空间: using Sy ...
- 由一个订单推送想到了ObservableCollection的神奇用法
最近在做taobao的一个卖家应用,需要订阅taobao的订单推送,示例代码如下: 看到上面的OnMessage场景之后,我突然就鬼使神差的在想最近写的一个服务,其中的一个功能是需要定时的轮询一个集合 ...
- 玉渊潭赏樱花有感:从无到有写一个jQuery开源插件
“玉渊潭公园樱花节”是每年樱花绽放时,都会在玉渊潭公园樱举办樱花节,游客前往玉渊潭公园,可以欣赏到20个品种2000株樱花.2016玉渊潭樱花节时间:3月中旬-4月中旬观赏最佳,2016年3月23日开 ...
- Servlet/JSP-08 EL表达式
EL - Expression Language 一. 基本语法 EL表达式以 ${} 的形式访问变量的值 1. "." 和 "[]" 运算符 <%@ p ...
- CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
如果你不知道在哪里可以找到ifconfig命令,请按照以下简单的步骤来找到它.首先,让我们找出哪个包提供了ifconfig命令.要完成这项任务,输入以下命令: [root@jrserver app_f ...
- aircack-ng抓握手包
1.关闭影响进程 airmon-ng check kill 将要进入监听模式的无线网卡断开它已连接的AP 2.查看无线网卡的名字 ifconfig ,例如 wlan0 3.进入监听模式: airmon ...
- Floyd算法解决多源最短路径问题
Floyd-Warshall算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包. Floyd-Warshall算法 ...