c 指標經典題目分析

2021-07-03 16:57:13 字數 864 閱讀 8247

首先看一下題目,下列程式會在那一行崩潰,程式如下:

#includeusing namespace std;

struct s;

int main()

雖然程式很短,但想要理解清楚,還是不容易的,首先先來說幾個知識點:

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]的問題:

#includeusing namespace std;

void sum(int a)

int main();

sum(&a[2]);

cout <

指標和陣列經典面試題目

前言 本篇文章主要針對前邊寫的一篇部落格深度理解指標。本篇文章是基於前邊所學到的知識的一些練習題目。利用陣列和指標的相關知識,解決下邊的問題。include int main int p int a 1 printf d,d a 1 p 1 return 0 題目分析 a 1是先取出陣列a的位址,然...

經典C 面試題目

1 在c 中,string str null 與 string str 請盡量使用文字或圖象說明其中的區別。回答要點 說明詳細的空間分配。10分 答 string str null 是不給他分配記憶體空間,而string str 給它分配長度為空字串的記憶體空間.請詳述在dotnet中類 class...

C 經典題目 約瑟夫環問題

有n個人圍成一圈,順序排號。從第乙個人開始報數 1 3報數 凡報到3的人退出圈子,問最後留下的人原來排在第幾號。首先由使用者輸入人數n,然後對這n個人進行編號 因為如果不編號的話,我們就不能知道最後是哪位童鞋留下來了 然後就開始了一圈一圈的迴圈,不斷形成新的圈子,不斷有人被淘汰,那麼迴圈到什麼時候截...