首先看一下題目,下列程序會在那一行崩潰,程序以下: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