【C语言】使用指针得到数组的最后一个数
問題描述
使用指向數(shù)組的指針,得到數(shù)組的最后一個數(shù)。
實現(xiàn)代碼
#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; }結(jié)果:
128合理性分析
比如說:
int m = 1;則:
*m 由于m不是指針變量,所以不存在。
&m 是指向m的地址。
*&m 是指地址為&m的內(nèi)存中存放的值,也就是m的值。
C語言的數(shù)組地址為其首元地址,每個元素地址都是其首地址。
比如一個長度為4的int數(shù)組,首元地址600000,第二個元素是600004,第三個元素是600008,最后一個元素是600012,數(shù)組地址范圍600000 ~ 600015,長16字節(jié)。
&a+1 表示了在數(shù)組首地址加上數(shù)組總長,上例則為600016。
同理,如果是&a+2 則表示600032,&+3 則為600048,……
上面的語句定義了一個int類型的指針,指向的位置是&a+1,上例的600016。
“相當(dāng)于”是一個新的數(shù)組,此時600016成了首元,p-1則是倒著取一個元素,地址600012,p-2則是600008,……
*(p-1)對p-1地址的數(shù)據(jù)取出,得到的正是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; }執(zhí)行結(jié)果:
6422000 6422000 1 6422000 6422032 6422064 6422096 6422032 6422028 6422024 7869392 128反思
看不懂就說明還是不會C/C++的指針,以后要加強對這方面的理解。
這篇文章的大部分結(jié)論都來自于自己做測試得到的猜測,未必都準(zhǔn)確,還望懂C/C++的讀者多多指教!
總結(jié)
以上是生活随笔為你收集整理的【C语言】使用指针得到数组的最后一个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】实验 设计一个按优先权调度算
- 下一篇: 【软件工程】解决方案构想