#include <iostream> 用dev-c++運行結(jié)果如下: The address of m is:2293584 我們發(fā)現(xiàn),打印的地址越來越小,為什么? C語言的3個主要存儲區(qū)為:堆、棧、全局區(qū);其中堆是程序員自己分配的,必須程序員自己手工釋放,比如malloc/free。棧是系統(tǒng)管理的,自己釋放。像函數(shù)中的形參、局部變量都是在棧里,而且(大部分編譯器中)棧是由高地址向底地址生長,像一個倒扣的捅一樣,參數(shù)進棧的順序是先進后出。所以上面打印的地址越來越小。 //m++; //error 這句話為何報錯?因為數(shù)組名只是個常量,編譯器沒為它分配空間,所以不能++ // cout <<"The value of q is:"<<*q<<endl; // error 這句話為何報錯,因為q是一個空指針,空指針的概念是:指針中的內(nèi)容為0 我們可以看下面一個小例子: int i=10; int * q= = &i; 其示意圖為: ××××:×××× ××××:10 也即: q本省自己的地址:i的地址 i的地址:10 q本身的地址可以用&q得到 q指針中的內(nèi)容可以用(int)q得到,即i的地址 cout <<"The address of q is:"<<&q<<endl; 但是本題中,我們是這樣定義 int *q=NULL;這時q指針中所存的地址為0,我們又知道,0地址的內(nèi)容是操作系統(tǒng)保護的,不能訪問,所以想通過0地址去訪問值是錯誤的,也即此時*p報錯。 所以// cout <<"The value of q is:"<<*q<<endl; 一句是錯誤的 最后我們說說為什么2次sizeof結(jié)果不一樣,一次為20,一次為4 在主函數(shù)中的sizeof是算一個數(shù)組的大小,數(shù)組的大小=數(shù)組元素個數(shù)*類型大??;即5*4=20,int類型在32位平臺下是4字節(jié)大小。 在一個函數(shù)中,如果用數(shù)組名做形參,那么編譯器會把其退化為一個指針對待,所以sizeof結(jié)果為4,正好是一個指針的大小。所以我們在f函數(shù)中可以寫:n++,而在main中m++卻報錯,就是這個原因,一個是指針,一個是數(shù)組,指針是變量可以修改,數(shù)組名是常量,不可以修改。 |
|