c++指针经典题目分析

原创 2015年07月08日 23:05:23

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

#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语言面试题 指针30个常错题型

来源:http://blog.chinaunix.net/u1/58640/showart.php?id=1354073 记下来以备不时之需。 1. char * const p; char cons...
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2013年12月28日 20:54
  • 20097

让你不再害怕指针——C指针详解(经典,非常详细)

前言:复杂类型说明     要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有...
  • soonfly
  • soonfly
  • 2016年04月12日 10:53
  • 51970

[C++] 经典练习题与解析(二)

(11) #include struct A { A() { std::cout
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年08月14日 00:31
  • 1522

c/c++经典1000例(100+900例) 包括详细题目、分析、源程序、可执行文件

  • 2010年08月30日 16:52
  • 169KB
  • 下载

C++指针联系题目

  • 2011年12月02日 16:32
  • 56KB
  • 下载

C++题目和答案涵盖多态和指针引用部分

  • 2011年04月28日 16:47
  • 23KB
  • 下载

经典C++笔试题目--100(数据类型、关键字(19-37))

数据类型、关键字(19-37) 19、C++是不是类型安全的?   【参考答案】不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。 20、 const ...
  • xiangjai
  • xiangjai
  • 2016年08月25日 12:16
  • 802

C/C++校招笔试面试经典题目总结三

题目21:求下面函数的返回值,输入x=9999;(微软) int func(x) { int countx = 0; while(x) { countx ++...
  • Tian779278804
  • Tian779278804
  • 2015年07月10日 16:12
  • 808

100条经典C++语言笔试题目-前50题

链接至100条经典C++语言笔试题目-后50题
  • sinat_20265495
  • sinat_20265495
  • 2016年12月03日 10:04
  • 1115

经典C++笔试题目--100(编程练习)(91-100)

经典C++笔试题目--100(编程练习)(91-100) 91、请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数。  【参考答案】 [cpp] view ...
  • qq_36864672
  • qq_36864672
  • 2017年07月24日 20:09
  • 250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++指针经典题目分析
举报原因:
原因补充:

(最多只允许输入30个字)