首先看一下题目,下列程序会在那一行崩溃,程序以下:ios
#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]这类问题的使用方法,下面会提到的;spa
如今开始对程序进行解读:指针
首先,*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;出错;blog
下面咱们再来看一个关于p[0]的问题:io
#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];class