23/7/2017  决定夯实基础,回顾指针的知识点,该博文转载于CSDN博主百家晓东,小部分修改,外加编译图引证

正文如下:


以下面的情况说明:

int a = 5;

int* p = &a;


结论:

*p   是指针变量p指向的变量a的存储内容,*p = 5;

p   是指针变量的存储内容,因为p指向a,所以p的存储内容(存储空间的值)就是系统为变量a分配的存储地址;

&p  是对指针变量p进行取地址的操作。


分析:

int a = 5;

int* p = &a;

int* q = p;

【说明】

上面的程序中首先声明了一个int类型的变量a,初始化为5;这个过程为:

变量 存储空间 存储地址
a 5 #ffa1

在初始化时,存储空间存储的是int型的值5,存储地址是由系统自动分配的,同理要声明一个指向a的指针,在初始化的时候赋值给指针变量的值应该是变量a的存储地址,故而有 int* p = &a;

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0

在下面的程序中:

int arr[] = { 1, 2, 5, 7 };

int* parr = arr;

一眼看去为什么arr没有取位运算符呢?因为数组变量名就代表数组的首地址(也就是数组的地址)。

同理,要是声明另外一个int类型的指针变量q:

(1)

int* q = p;

声明了一个int类型的指针变量,并将指针变量p的值赋予q,同样是变量,a = 5,5是变量a的存储空间的值,那么p=?,p等于p存储空间的那个值,即p=#ffa1(a的存储地址);现在将这个值赋给了指针变量q,正如a初始化的过程一样,int a=5的过程,是将5存储在了int类型变量的存储空间之中,初始化指针变量q时,也是将等号右边的值存储在q的存储空间之中,上边的操作的结果如下:

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0
q #ffa1 #ffb1

使得指针变量q指向了变量a。

【说明】

从上面的操作可以看出,p代表的就是指针变量p的存储空间的值,上图中的#ffa1,也是p指向的变量的存储地址。(p的值如上图红色)

(2)

int* q = &p;

声明了一个指针变量q,并对q进行初始化,将指针变量p的存储地址赋给了指针变量q,那么在q的存储空间中存储的就是p的存储地址,上面的操作的结果就是:

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0
q #ffc0 #ffb1

使得指针变量q指向了指针变量p.

【说明】

从上面的操作可以看出,&p代表的是指针变量p的存储地址。(p的值如上图红色)

(3)

int* q = *p;

声明了一个指针变量q,并对其初始化,这一过程的操作如下:

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0
q 5 #ffb1

为指针变量q初始化,q的存储空间中存储的值为5.

【说明】

1.从上面的操作可以看出,是将*p的值赋给了q,p指向变量a,p=#ffa1,而*p的过程就是获得p地址处的存储空间的值,即*(#ffa1)=5,也就是将5赋给了指针变量q,q的存储空间存储的是5;

2.指针变量是指向某一变量的变量,在其存储空间中存储的一般是其他变量的存储地址,上面的初始化过程int* q = *p;是非常危险的,有可能造成程序奔溃。


引证图如下:

  显然,我们需要区分存储地址与存储空间的概念,在这里,p的存储空间是&a,而存储地址是int类型地址里a地址的前一个地址 (FF08与FF0C只差一个二字节)

指针变量的*p,p以及&p的区别的更多相关文章

  1. C语言指针变量作为函数参数

    0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...

  2. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  3. C++函数返回局部指针变量

    遇到过好几次关于函数返回指针变量问题,有时候是可以的,有时候是不可以的,然后就混乱了.今天研究了下,结果发现原来和内存分配有关. 用下面的例子分析下吧: char * test() { char a[ ...

  4. 【C语言入门教程】4.4 指针 与 指针变量

    在程序中声明变量后,编译器就会为该变量分配相应的内存单元.也就是说,每个变量在内存会有固定的位置,有具体的地址.由于变量的数据类型不同,它所占的内存单元数也不相同.如下列声明了一些变量和数组. int ...

  5. 【C语言入门教程】4.5 指针变量的定义与引用

    指针变量是包含内存地址的变量.一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址.普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值.指针变量在使用前需要声明与 ...

  6. DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?

    DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?比如我定义个变量 var p:Pchar;如果这个变量声明为全局变量,需要分配内存吗?分配为局部变量,需要分为内存吗?为什么 ...

  7. c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量

    一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址 ...

  8. 分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

    BOOL型变量:if(!var)    int型变量: if(var==0)    float型变量:    const float EPSINON = 0.00001;    if ((x > ...

  9. C语言函数指针变量和指针函数以及指针数组

    C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这 ...

随机推荐

  1. shell脚本 expect 实现自动登陆

    vi auto_ssh.exp #!/usr/bin/expect   set ipaddress "123.227.159.159" set passwd "你的密码& ...

  2. js判断手机或Pc端登陆.并跳转到相应的页面

    <script src="~/Web/js/jquery-1.10.1.min.js"></script> <script> $(functio ...

  3. 七、Hadoop学习笔记————调优之Hadoop参数调优

    dfs.datanode.handler.count默认为3,大集群可以调整为10 传统MapReduce和yarn对比 如果服务器物理内存128G,则容器内存建议为100比较合理 配置总量时考虑系统 ...

  4. qt学习教程1.qt开发环境搭建

    qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...

  5. nginx+tomcat安装配置

    nginx+tomcat安装配置 # nginx+tomcat安装配置 #创建网站目录 mkdir -p /www/wwwroot cd /www #安装配置 wget http://mirrors. ...

  6. 企业实战Nginx+Tomcat动静分离架构的技术分享

    Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat.Re ...

  7. FFmpeg之AVPacket

    花满楼原创 AVPacket,是压缩数据的结构体(解码前或编码后的结构体). 本文介绍FFmepg中常见结构AVPacekt,尽量用具体值来理解. 整个用于调试的代码可以这样写: #include & ...

  8. C#的数据类型总结(1)

    C# 是一种强类型语言.在变量中存储值之前,必须指定变量的类型,如以下示例所示: int a = 1; string s = "Hello"; XmlDocument tempDo ...

  9. jquery写的树状列表插件-alvintree

    在做项目的时候遇到选择部门下人员的功能,可多选可单选,所以就想着使用树状列表来进行选择,但在网上找了很多,发现要么就是挺复杂,要么就是需要各种前端框架的支持,试了一个感觉难用,所以就想着自己写一个简便 ...

  10. java8版本base64加密解密

    首先,先是加密,这里我使用了base64类 try { String asB64 = Base64.getEncoder().encodeToString("http://www.baidu ...