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的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. AndroidStudio报错:Emulator: I/O warning : failed to load external entity "file:/C:/Users/Administrator/.AndroidStudio3

    场景 在进行Android Studio的.Android Studio目录从C盘修改为其他目录后,新建App启动提示: Emulator: I/O warning : failed to load ...

  2. Elasticsearch之增加和删除索引

    增加索引 利用postMan工具发送restfulAPI添加索引库 请求方式为put代表添加 创建索引index时映射mapping 请求URL: 使用put发送http://localhost:92 ...

  3. Ubuntu-Server18.04开启无线网卡并配置静态ip

    手里有一个笔记本快10年了,还是奔腾处理器,最近把它做成了Ubuntu-Server的系统,花了点时间折腾无线网卡,稍微记录一下,希望看见的人能少踩点坑. 1. 制作U盘启动工具,从Ubuntu官网下 ...

  4. EF--EntityState相互转换

    EF对数据做什么样的操作,是根据EF的上下文实体状态决定,实体状态有以下5种状态,下面我们就分别看下这5种状态 数据准备,我们看到学生表里有20000名学生记录,最后1位学生的学生编号为0000020 ...

  5. VLAN和子网之间的区别与联系

    通常来说,子网和VLAN的相似之处在于它们都处理网络的一部分的分段或分区.但是,VLAN是数据链路层(OSI L2)的构造,而子网是网络层(OSI L3)的IP构造,它们解决网络上的不同问题.尽管在V ...

  6. java基础--------arraylist(动态数组)和linkedlist(双向链表)的区别

    arraylist使用数组存储数据,所以这样存储的数据根据索引查询的数据速度快,但是新增或者删除元素时需要设计到位移操作,所以比较慢. linkedlist使用双向链表方式存储数据,每个元素都记录前后 ...

  7. 木兰国产编程语言 Mulan--附带下载地址

    我国自主研发的 编程语言:木兰. 中国新闻网 : http://www.cas.cn/cm/202001/t20200116_4731821.shtml 说明介绍 百度一番后,发现没有下载地址,没有官 ...

  8. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  9. Android实战项目——家庭记账本(五)

    今天博客写的有点晚(好像算是昨天的了),有一点小bug刚刚改完.今天完成的任务有: 1.统计页的布局和功能 2.主页碎片的图表功能 实现效果如下:                      其中,统计 ...

  10. 数字孪生 VS 平行系统

    数字孪生和平行系统作为新兴技术,在解决当今人工智能邻域面临的信息量大,干扰信息不确定因素多,与人的参与沟通更加紧密,人机互动更加重视,为了使人们有更好的体验人工智能带来的便利,急需推动信息物理社会的高 ...