【C语言】使用指针得到数组的最后一个数
生活随笔
收集整理的這篇文章主要介紹了
【C语言】使用指针得到数组的最后一个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
使用指向數組的指針,得到數組的最后一個數。
實現代碼
#include <stdio.h> int main() {int a[8] = {1, 2, 4, 8, 16, 32, 64, 128};int *p = (int*)(&a + 1);printf("%d\n", *(p - 1));return 0; }結果:
128合理性分析
比如說:
int m = 1;則:
*m 由于m不是指針變量,所以不存在。
&m 是指向m的地址。
*&m 是指地址為&m的內存中存放的值,也就是m的值。
C語言的數組地址為其首元地址,每個元素地址都是其首地址。
比如一個長度為4的int數組,首元地址600000,第二個元素是600004,第三個元素是600008,最后一個元素是600012,數組地址范圍600000 ~ 600015,長16字節。
&a+1 表示了在數組首地址加上數組總長,上例則為600016。
同理,如果是&a+2 則表示600032,&+3 則為600048,……
上面的語句定義了一個int類型的指針,指向的位置是&a+1,上例的600016。
“相當于”是一個新的數組,此時600016成了首元,p-1則是倒著取一個元素,地址600012,p-2則是600008,……
*(p-1)對p-1地址的數據取出,得到的正是600012存的元素,即第四個元素,也是最后一個元素。
測試
#include <stdio.h> int main() {int a[8] = {1, 2, 4, 8, 16, 32, 64, 128};int *p = (int*)(&a + 1);printf("%d\n", a);printf("%d\n", &a[0]);printf("%d\n", *a);printf("%d\n", &a);printf("%d\n", (&a+1));printf("%d\n", (&a+2));printf("%d\n", (&a+3));printf("%d\n", p);printf("%d\n", (p - 1));printf("%d\n", (p - 2));printf("%d\n", *p);printf("%d\n", *(p - 1));return 0; }執行結果:
6422000 6422000 1 6422000 6422032 6422064 6422096 6422032 6422028 6422024 7869392 128反思
看不懂就說明還是不會C/C++的指針,以后要加強對這方面的理解。
這篇文章的大部分結論都來自于自己做測試得到的猜測,未必都準確,還望懂C/C++的讀者多多指教!
總結
以上是生活随笔為你收集整理的【C语言】使用指针得到数组的最后一个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】实验 设计一个按优先权调度算
- 下一篇: 【Java】浅谈关键词transient