C++——指针1
7、关于内存地址
内存空间的访问方式:通过变量名访问,通过地址访问;
地址运算符:& 如:int var; 则&var表示变量var的内存起始地址;
//& 出现在声明语句中出现时引用,别名而已,在运算表达式中出现&,说明是取内存地址。
7.1 指针变量的概念 指针:内存地址,用于间接访问内存单元
指针变量:用于存放地址的变量
声明: 如 static int i; static int *i_point[p1] =&i;
在声明语句中,指针变量i_point存放的是内存地址&i,(*i-point)存放的是i的数值。
指针初始化:语法形式 存储类型 数据类型 *指针名=初始地址;
注意事项:用变量地址作为初值时,该变量必须在指针初始化之前已经说明,且变量类型应与指针类型一致。可以用一个已赋值的指针去初始化另一个指针变量;不要用一个内部auto变量去初始化static指针。
指针变量的赋值运算: 指针名=地址 1.地址中存放的数据类型与指针类型相符;
2.向指针变量赋的值必须是地址常量或变量,不能用普通整数,但可以赋值为0,表示空指针;
3.指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都unsigned long int类型;
4.允许声明指向void类型的指针,该指针可以接受任何类型对象的地址。
#include<iostream>
using namespace std;
int main()
{
int *i_pointer; //声明int型指针i_pointer
int i; //声明int型数i
i_pointer=&i; //取i的地址赋给i_pointer
i=10; //int型数赋初值
cout<<"Output int i="<<i<<endl; //输出int型数的值
cout<<"Output int pointer i="<<*i_pointer<<endl; //输出int型指针所指地址的内容
}//程序运行的结果是:Output int i=10,Output int pointer i=10
使用void类型的指针:
void vobject;//错,不能声明void类型的变量
void *pv;//对,可以声明void类型的指针
int *pint; int i;
int main(){ pv = &i; //void类型指针指向整型变量
//void指针赋值给int指针需要类型强制转换:
pint = (int *)pv;
}
7.2 指向常量的指针
不能通过指针来改变所值对象的值,但是指针本身可以改变,可以指向另外的对象。
例1
char *name1="John"; //name1是一般指针,该字符串的地址赋值给name1
*name1='A'; //编译正确,运行出错,因为这试图改变字符串常量"John"的值。
例2
const char *name1="John"; //指向常量的指针,但是name1本身依然是变量。
char s[]="abc";
name1=s; //正确,name1本身的值可以改变
*name1='1'; //编译时指出错误
若声明指针常量,则指针本身的值不能被改变;
char *const name2=”john”;
name2=”abc”;//错误,指针常量值不能改变。
7.3 指针变量的算术运算
指针与整数的加减运算
– 指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。
– 这种运算的结果值取决于指针指向的数据类型。
指针加一,减一运算
– 指向下一个或前一个数据。
– 例如:y=*px++ 相当于 y=*(px++)
(*和++优先级相同,自右向左运算)
关系运算 同类型的指针变量可以相互比较和与0比较;
赋值指针 赋值给指针的必须是变量或常量,不能是普通整数,除了0。
C++——指针1的更多相关文章
- 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 ...
随机推荐
- .net core 3.0 swagger
1.安装swagger包 2.startup里configservers Configure 3.可能出现的错误 提示error xxxxnot found 由于我创建的webapi是restful ...
- C# MVC 中自定义权限特性[Authorize]中对于Ajax访问的处理
在MVC中定义自己的权限特性. 下例中是简单的登录判断,登录信息存与Session中,如果Session中没有登录信息,那么就不通过. 在处理无权限的时候,判断当前请求是否为Ajax请求,如果是Aja ...
- js增删class的方法
接下来我来介绍两种方法 我们先来一段HTMl代码 <div id="bb"> 你好呀 </div> 接下来我们再来一段css样式 .ob { color:r ...
- 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历
/* 题目: 将二叉搜索树转化为排序的双向链表,不能创建新的节点, 只能调整节点的指向,返回双向链表的头节点. */ /* 思路: 递归. 二叉搜索树的中序遍历得到的序列是递增序列. 左子树left& ...
- IIS7启用ASP程序的步骤。
IIS7配置asp程序 https://www.cnblogs.com/rollup/p/4969502.html
- 自用浏览器的 User-agent 表
浏览器版本号见请求. 浏览器 User-agent Internet Explorer Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11. ...
- [TJOI2007] 足彩投注
足彩投注 题目概述 题目背景 了解足球彩票的人可能知道,足球彩票中有一种游戏叫做"胜负彩",意为猜比赛的胜负.下面是一些与胜负彩有关的术语 注 :每一组有效组合数据. 投 注:彩民 ...
- [Python]scatter_matrix报错 module 'pandas' has no attribute 'scatter_matrix'
运行pandas.scatter_matrix()散点图函数时报错, 原因是该函数在新版本用法发生了变化: pandas.plotting.scatter_matrix 完整用法:pd.plottin ...
- LOJ6287 诗歌
题意 给定一个排列,问是否存在\(\forall a,b,a\neq b\)满足\(2|(a+b)\)且\(\frac{a+b}{2}\)在\(a,b\)间 做法 枚举中点\(a\),即需要存在类似\ ...
- vim 配置 jedi-vim( ubuntu:15.10 )
确保 vim 支持 python3 或者 python 如果你已经安装了 vim, 可以通过vim --version, 在输出中找到 +python3 或者 +python 字样的话, 就可以跳过该 ...