在c、c++,最牛皮也是最令人頭疼的就是指標了,記得那時是乙個炎熱的下午,老師吐出了那兩個讓我畢生難忘的字:指標(然後太熱了睡著了)。還記得當時,老師就提醒我們指標是c強大的重要部分,但同時如果處理不好,問題也很大。
但其實吧,學習指標的壓力也不是那麼大的。(自行補圖)
typename * pointname;
如int * a;
a儲存的是乙個位址,而* a則儲存乙個int型的變數。
重要的是a儲存的位址,而不是 *a的內容,因為位址確定的內容也是確定的。
所以,下列**是有問題的:
int
*a;a =
233;
這裡的a儲存啥位址?不知道。
不知道指標指向**就是風險!,所以指標在建立的時候要初始化一下。
如果建立指標之後沒有初始化目標,就初始化為null;null可以理解為0位址,但又有所不同。
還有乙個令人迷惑的行為,int *a=null;前面說了 *a應當是乙個int型,但為什麼賦值為乙個位址?
其實這個過程是給a賦值的過程,而不是給 *a這個整體。
開始了,開始了,c的乙個難點。
int a[10]=;
int * p=a;//眾所周知,a不但是陣列名同時也是a的位址
所以輸出a的方式:直接a或者 * p;
如果是輸出a,方法也有很多:
a[
1]、*(++p)、*(p+
1)、p[
1]
沒錯,p可以直接當成陣列名使用,不論是主函式還是其他函式內。
這裡面的p+1要提一下,是加一之後解引用(就是加星號的標準說法),所以加一對應的是位址加乙個,
是加乙個int位址的長度,所以到達了a[1]的座標,才會輸出a[1]的。
這裡的字串是指char陣列,而不是c++的string類。
char color[10]
="blue"
;printf
("my lucky color is %s"
,color)
;
正常應該是輸出blue。
看起來尋常不過,但是之前提過color是color[0]的位址,但是他直接就輸出了整個字串。
所以下面的**也是成立的。
char
*p="name"
;//這裡的name是這個字串的位址
按上面的來,那麼(int *)p應該是什麼? 是name這個字串的位址
struct link
沒錯,還是鍊錶。
struct link head如果想呼叫data,需要的是成員運算子 『.』
但是如果是乙個指標struct link* head,他的data成員應該是(*head).data//加括號是因為優先順序的原因。
很麻煩,所以出現了箭頭運算子head->data。
說到鍊錶不得不提的問題就是在插入刪除時如果控制不好,會造成斷鏈,就是前乙個指標不知道指向**或者是指向乙個被釋放的空間、甚至是head沒有初始化,這些都很危險!
而邊界條件這些更是新手學習鍊錶的大坑。
總之指標的建議就是要多練習,聽懂和能用還是差了很多,犯錯什麼的都很正常。
C語言指標概念的一些見解
一級的指標 首先說一下指標的概念 拿int p來說,就是定義乙個指標,p指向一段記憶體空間,p的值為這塊記憶體空間的位址,這塊空間裡面存的是int型別的空間,也就是從位址的位置開始的四個位元組的記憶體上會存放int 型別的資料,而p的值永遠是位址,並且這個位址不會改變,使用p就可以訪問這塊記憶體空間...
CSRF XSS Cookies 的一些見解
csrf 攻擊 在瀏覽器中插入了 惡意鏈結 並在使用者訪問之時讓使用者訪問,達到使用使用者的cooikes達到連線指定伺服器客戶的的驗證資訊,並進行一些簡單的操作。比如 防禦 最簡單的,可以通過驗證cookies進行一些防禦。例如在使用者操作驗證中,判斷是否又cookies傳過來,如果沒有則是惡意鏈...
單鏈表的一些見解
關於q next p next和q p next的理解 假令 q為結點1,p為結點2,即q的物理儲存位址為00293590,q中指標域中儲存位址為00293558,q中資料域為11 即p的物理儲存位址為00293558,q中指標域中儲存位址為00293448,q中資料域為12 q next p ne...