地址,是一個“處所”概念。處所總要一個指示的方式,比如二維或三維空間中一個點,需要用一組有序數來表示其確切位置,而這位置又與實現選定的原點有關(學過高中物理的都應該很清楚這種概念),那麼,這個“地址”顯然不是一個“數”。雖然計算機的內存是一維的,但邏輯上地址與前述二維或三維空間相同,也不是一個數,而且,在以前的16位機時代,用16位的指針也可以用基址和偏移值的方式構造出32位的地址,即兩個16位數用高低位拼接成一個更大的數字,CPU先定位基址,然後在此地址之上再延伸,通俗地說是駁接,那樣的原理上說地址是可以無限的,那個時候有Large指針和Huge指針的概念,誰都明白指針值不僅僅是整數,而是一個有機結構。
實際上,計算機的字元是8位二進制字節,16位、32位、64位整數,都是用同樣的拼接方式用最基本的8位值構造出來的,閱讀一個16位的整數,可以分開兩部分,高8位和低8位,搞8位就乘以256,加低8位,即是實際值。指針也是這般,基址乘以多少,是約定的,然後尋址就祗寫偏移值,所以,當看到一個偏移指針時,那就不是真實地址。
地址,或指針,不是一個整數,那是必須要搞清楚的概念。printf()輸出地址,用%p約定符,是以前就傳下來的,因為那個時候,地址確實不是整數,所以不用%d,16位的%d形式不可能表達更高位數的地址,正如對長型數必須用%l告知處理方式不同一樣。