學習C肯定會碰到指針,指針是C的靈魂。所以學好指針很關鍵,這裏寫一些指針方面的容易錯的或者易混淆的知識點還有自己不會的盲點,以便之後複習時用。
數組傳參和數組形參
1.1 數組傳參
如果函數遇到數組傳參的,不論是什麼形式的形參,只要是數組,那麼被調函數都將這個形參都當做指針來使用。
#include "stdio.h"
一般我們使用數組傳參。
下面還有一種形參表示方法也很常用,效果其實是一樣的。
#include "stdio.h"
甚至還有一種方法:
#include "stdio.h"
1.2 數組傳參實質
數組實質傳的都是指針,不論什麼表現形式。
#include "stdio.h"
可以看到num1的值均為1。
實參都是數組,形參都是指針,無論什麼形式。
數組首元素地址和整個數組地址
#include "stdio.h"
從這組輸出我們可以看到幾點:
a數組大小是40。因為一個int是4字節,一共10個。
數組a和&a值一樣
但是a是數組首元素地址,而&a是整個數組地址。
這個原因也導致另外兩個值不同。a 1就是第二個元素地址,偏移4字節
&a 1是相當於偏移整個數組大小,也就是40字節。
變量在內存中的位置
變量在內存中有四個地方可以存放,讀取修改變量實質都是通過指針修改。
3.1 變量存放的區域
3.2 常量例子
#include "stdio.h"
在內存中表示為:
因為GetChar函數里面都是指針所以都放在棧區,而常量都在全局區。
當被調函數return之後,上面兩個指針被釋放,然後將地址賦給main函數里面的指針,他們就指向相應的值。
接下來,還有一個易錯的點!!!
#include "stdio.h"
main函數里面指針地址是一樣的
3.3 堆和棧例子
用户自己申明的變量是在堆中存放的,只有用户釋放。
#include "stdio.h"
內存中分佈:
當GetString被調用後,s釋放之後,malloc分配的空間還是存在,所以還能繼續打印。
接下來的問題在實際寫的過程中會犯錯:
#include "stdio.h"
這時的p2其實打印不出來或者程序死機了。這是因為GetString1中的s1變量是申明在棧區中,當調用結束後,被釋放了,那塊區域中的qwerty就沒了。但是地址還是那個10字節的起始地址,並沒有全部return出來。
其他
內存中的棧是開口向下的。