程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言 對數組名取地址

C語言 對數組名取地址

編輯:關於C

作者 : 卿笃軍


你有沒有想過,對一個一維數組名取地址,然後用這個地址進行加減運算。這會出現什麼樣的結果呢?

示例:

int a[5] = {1,2,3,4,5};

int *p = (int *)(&a+1);

printf("%d\n",*(p-1));


這個輸出會是多少呢?

咦?為什麼第二行需要強制轉化類型呢?

答:a是一個一維數組的名字,&a相當於一個指向一維數組的指針。怎麼感覺這麼熟悉?指向數組的指針,那不就是行指針嗎?int (*p)[]。

行指針+1,就是對指針進行加減操作,其結果還是一個行指針~~~原來如此,需要強制轉換為單指針。


那麼,輸出結果是多少呢?

答:當然是5。

為什麼?

答:上面不是說了嘛,&a就是一個行指針,那就是指向一行的指針咯。行指針+1,不就指向下一行了,這裡一行為[5]個,那麼int *p = (int *)(&a+1)就要在a的基礎上偏離5個位置:(如下:上一行表示偏離位數,下一行表示a[]中對應的數據)

0 1 2 3 4 5

1 2 3 4 5 *

咦,這不是越界了嗎?移動五位都跑出a[]數組處於' * '號位置了。哦,我看到printf()輸出了。你輸出的是*(p-1),這裡p是一個單指針-1就是往左位移一位就行了,那不就是又回到5的位置了嗎?原來是這樣,輸出結果是5 。


下面我們用一段代碼來顯示位移情況~~~

#include 

int main()
{
	int a[5] = {1,2,3,4,5};
	int *p = (int *)(&a+1);   //+1相當於移動了5位

	printf("%p\n%p\nbit = %d\n",a,p,p-a);
	printf("%d\n", *(p-1));

	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved