首先看一下题目,下列程序会在那一行崩溃,程序如下:

#include<iostream>

using namespace std;

struct S{
int i;
int *p;
}; int main(){
S s;
int *p = &s.i;
p[0] = 4;
p[1] = 3;
s.p = p;
s.p[1] = 1;
s.p[0] =2;
return 0;
}

  

虽然程序很短,但想要理解清楚,还是不容易的,首先先来说几个知识点:

1.对于struct结构体来说,它所分配的空间是连续的;

2.p[0]代表p所存储地址的值,关于p[0]这类问题的使用方法,下面会提到的;

现在开始对程序进行解读:

首先,*p=&s.i,代表p存储s.i的地址,下面给p[0] = 4,则代表给p所指向的地址赋值为4,也就是s.i = 4;然后是p[1],p[1]代表p所指向地址的下一个地址,在结构体里面地址是连续的,因此p[1]也就指向的是p所指向地址的下一个地址,也就是s.i的下一个地址,也就是s.p,给p[1]赋值也就是给s.p赋值,s.p为指针类型,因此用十六进制表示,所以s.p为0x3;下面是s.p指向p指针(这里两个p有点绕口,但时刻要记得结构体中的p前面带s),那么s.p就指向的是p所指向的地址,也就是s.i,下面是s.p[1] =1,也就是给s.p指向地址的下一个地址赋值,也就是给s.i的下一个地址赋值,也就是给自己赋值,因此将自己的值赋为0x1,也即为s.p指向了0x1这个地址,下面给s.p[0] =2;这个也就是给s.p所指向地址赋值,这样可以成功吗?当然是不行了,s.p指向的地址是什么?是0x1这是一个未作声明的空间,因此程序将会访问出错,也就是在s.p[0]=2;出错;

下面我们再来看一个关于p[0]的问题:

#include<iostream>

using namespace std;

void sum(int a[]){
a[0] = a[-1] +a[1];
} int main(){
int a[10] ={1,2,3,4,5,6,7,8,9,10};
sum(&a[2]);
cout <<a[2]<<endl;
return 0;
}

  

结果呢?是6,为什么呢?传进去的a[2]的地址,大家也都知道,函数中数组做形参传递的是数组的首地址,因此也就明白了,大概就类似于a[2] =a[1] +a[3];

c++指针经典题目分析的更多相关文章

  1. Oracle Certified Java Programmer 经典题目分析(一)

    Given: 1. public class returnIt { 2. returnType methodA(byte x, double y){ 3. return (short) x/y * 2 ...

  2. Oracle Certified Java Programmer 经典题目分析(二)

    ...接上篇 what is reserved(保留) words in java? A. run B. default C. implement D. import Java 关键字列表 (依字母排 ...

  3. 学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

    本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足 ...

  4. 【转】Matrix67:十个利用矩阵乘法解决的经典题目

    好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的 ...

  5. 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】

    阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...

  6. DP---基本思想 具体实现 经典题目 POJ1160 POJ1037

    POJ1160, post office.动态规划的经典题目.呃,又是经典题目,DP部分的经典题目怎就这么多.木有办法,事实就这样. 求:在村庄内建邮局,要使村庄到邮局的距离和最小. 设有m个村庄,分 ...

  7. 猴子吃桃问题之《C语言经典案例分析》

    猴子吃桃问题之<C语言经典案例分析>一.[什么是猴子吃桃]       猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将第一天剩下的桃子吃掉一半 ...

  8. [leetcode]53Maximum Subarray动态规划经典题目:最大子串问题

    /** * Find the contiguous subarray within an array (containing at least one number) * which has the ...

  9. cc++面试------17道经典面试题目分析

    以下是C/C++面试题目,共计17个题目,其中涵盖了c的各种基础语法和算法, 以函数接口设计和算法设计为主.这17个题目在C/C++面试方面已经流行了多 年,大家需要抽时间掌握好,每一个题目后面附有参 ...

随机推荐

  1. wcf 代理实例

    通过过代理调用 wcf服务 using Microsoft.Extensions.Options; using System; using System.Collections.Generic; us ...

  2. comtextMenu 如何正确的响应MouseLeave事件

    今天给菜单加上这个事件,发现弹出菜单后 鼠标怎么动都不会触发 mouseLeave事件 解决方法是 在菜单loaded事件中,利用visualTreeHelper 访问他内部的border控件,把这个 ...

  3. 用友u8各版本在输出的时候报错提示:外部数据库驱动程序(1)中的意外错误

    从10月12日起很多U8用户反馈,在各版本U8中输出报表时软件报错,报错内容“外部数据库驱动程序(1)中的意外错误”,经初步分析有以下解决方案:1.卸载微软的补丁:(1)如果是PC操作系统(一般是客户 ...

  4. C# WinForm TreeView选择父节点子节点全选

    //设置标志,防止死循环 bool check = false; public void TV_AfterCheck(object sender, TreeViewEventArgs e) { if ...

  5. Qt之自定义搜索框——QLineEdit里增加一个Layout,还不影响正常输入文字(好像是一种比较通吃的方法)

    简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 方案一:调用QLineEdit现有接口 void ...

  6. Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

    一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...

  7. 怎样让窗口不显示在任务栏和ALT+TAB中(隐藏窗口再嵌套,几乎是万能的办法)

    之前想弄个像QQ旋风那样的悬浮窗口,就研究了下怎么让窗口不显示在任务栏中,方法其实很简单就是将窗口的扩张属性设置成WS_EX_TOOLWINDOW,MSDN中对该属性有详细介绍,代码如下: ::Set ...

  8. better later than never

    工作一年半,写程序也有几年了,终于开了个博客,记录一下遇到的问题和解决方法,和其他需要记录的东西.希望自己不会懒……已经开通两周了才开始写,唉……

  9. export命令的使用

    一:export将环境变量昭告天下     1.直接输入export会将显示bash下的所有环境变量       2.env/set/export/declare都可以显示shell的变量       ...

  10. Centos7离线安装mysql8

    linux版本:Centois7 mysql版本:5.7 一.安装 1.下载mysql离线安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 选择如下: [ ...