您好,登錄后才能下訂單哦!
本篇內容介紹了“C語言數組中的a與&a有什么不同”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
首先,看一段代碼:
#include <stdio.h>
int main(void)
{
int a[5] = {0,1,2,3,4};
printf("a = %d , &a = %d \n", a, &a);
return 0;
該代碼運行結果為:
可見,對于一個數組:
int a[5] = {0,1,2,3,4};
a與&a的值是相同的。為什么呢?
a是數組名,是一個數據區的常量,對其取地址(&a)就可以得到數組存儲區域的地址,同樣,a本身也代表了數組存儲區的首地址。所以,a與&a的值是一樣的。但是,雖然a與&a指向同一個地址,但是他們的含義是不同的。下面我們修改一下上面的代碼看看"a+1"與"&a+1"是否還相等?修改后的代碼運行結果為:
可見,a+1的值比a的值大4,即sizeof(a[0]);&a+1比&a的值大20,即sizeof(a)。由此,可得出結論:a+1指向的地址相對與a指向的地址向后偏移了sizeof(a[0])個字節,&a+1指向的地址相對與&a指向的地址向后偏移了sizeof(a)個字節,其描述圖如下:
看了這張圖,想必大家已經對a與&a有了一個清晰的認識了吧。下面分析一段代碼:
#include <stdio.h>
int main(void)
{
int a[5] = {0,1,2,3,4};
int *ptr = (int*)(&a+1);
printf("*(a+1) = %d, *(ptr-1) = %d\n",*(a+1), *(ptr-1));
return 0;
}
運行結果是什么呢?
運行結果為:
*(a+1) = 1, *(ptr-1) = 4
*(a+1) = 1,是因為a+1代表數組第二個元素的地址,即&a[1],*(a+1)為取該地址上的值,即為1;*(ptr-1)=4,是因為ptr指向的是整個數組內存區域之后的內存,即數組最后一個元素之后的地址,ptr-1就是指向數組的最后一個元素,*(ptr-1)為取該地址上的值,即為4。
“C語言數組中的a與&a有什么不同”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。