天天看點

從一個小程式說起-數組指針

#include <stdio.h> #include <stdlib.h> int main() {     int a[3] = {7,8,9};     printf("一維數組測試:\n");     printf("a = %p\n", a);     printf("*a = %p\n", *a);     printf("&a = %p\n", &a);     printf("*(&a) = %p\n", *(&a));          printf("a+1 = %p\n", a+1);     printf("*(a+1) = %p\n", *(a+1));          printf("&a+1 = %p\n", &a+1);     printf("*(&a+1) = %p\n", *(&a+1));          printf("(&a+1)-&a = %p\n", (&a+1)-&a);     printf("*(&a+1)-a = %p\n", *(&a+1)-a);     printf("*(&a+1)-*(&a) = %p\n", *(&a+1)-*(&a));     getchar();     return 0; }

首先我們要知道以下定義:

int (*p)[3];

p = &a;

p是一個指向具有3個int型元素的數組的指針。簡稱數組指針。

p+1的結果:為了更好地回答這個問題,我們來看如下定義:

int *r;

r = a;

r是一個指向int型元素的指針。

r+1我們都可以知道就是數組a[1]的位址。數組a的每個元素都是占四個位元組的int型。這四個位元組被編譯器看作一個整體。r+1的具體算法如下:r+1 = r + sizeof(int)。

此時我們來看一下p+1:注意上面出現的兩句話:

p是一個指向具有3個int型元素的數組的指針。

r是一個指向int型元素的指針。

r+1時編譯器會把int裡四個自己看作一個整體,p+1編譯器也會把int裡的四個自己看作一個整體。但是p是一個指向具有3個int型元素的數組的指針,是以p+1 = p + (sizeof(int))*3。

即p+1指向了a[3]的位址。

&a+1 = p+1 = &(a+3)

*(&a+1) = *(p+1) = &a[3];

 (&a+1)-&a = p+1-p = 1;

*(&a+1) - a = &a[3] - &a[0] = 3.

最後一個就不用我分析了。

我在這裡還想說一點,就是關于對數組a取位址的用法:&a。其實這個程式的苦澀都是這個用法惹的禍。我認為編譯器應該對這種用法加以限制。畢竟它是沒法解釋的。因為a是一個指針常量,我們是不能對常量取位址的。可是目前的編譯器都對它放任.

希望對這個有研究的提點意見啊。謝謝了。

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script> 閱讀(292) | 評論(0) | 轉發(0) | 0

上一篇:DNA Sorting

下一篇:個人履歷

相關熱門文章

  • Oracle資料庫學習之rownum...
  • oc總結
  • Linux裝置驅動程式
  • Android對Linux核心的增強- lo...
  • 淺析armlinux2.4.19啟動程式[h...
  • test123
  • 編寫安全代碼——小心有符号數...
  • 使用openssl api進行加密解密...
  • 一段自己列印自己的c程式...
  • sql relay的c++接口
  • 初學UNIX環境進階程式設計的,關于...
  • chinaunix部落格什麼時候可以設...
  • 一個通路量較大網站的伺服器。...
  • 收音機驅動與v4l2架構的關系,...
  • 如何将linux驅動改為裸機驅動(...

給主人留下些什麼吧!~~ 評論熱議