指针在数组里的加法
在C語言中,指針與數(shù)組經(jīng)常放在一起使用,很多情況下數(shù)組和指針可以互相轉換。
//偽代碼 int arr[10] = {0,1,2,3,4,5,6,7,8,9};int * p = arr;arr[i] == * (p+i);//i是大于0小于數(shù)組長度-1的任何正整數(shù)*(arr+1) == arr[i];?數(shù)組和指針的不同:
(1)大小不同。
(2)指針可以++,數(shù)組名不可以
(3)訪問方式不同
數(shù)組名在代碼中的使用
(1)在定義數(shù)組的同一個函數(shù)中,sizeof(數(shù)組名)表示整個數(shù)組的大小
(2)在定義數(shù)組的同一個函數(shù)中,&數(shù)組名+1,表示加上整個數(shù)組的大小
(3)其他情況:數(shù)組名表示首元素的地址
#include<stdio.h>int main() {int arr[5] = {1,2,3,4,5};int *p1 = (int *)(&arr+1);printf("%d\n",p1[-2]); ?int *p2 = (int *)((int *)&arr+1); ? ? ? ? ? ? ?printf("%x\n",*p2); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??int *p3 = (int *)((int)&arr+1);printf("%x\n",*p3);return 0; }在本例中,(&arr+1)指向的地址是數(shù)組末尾的地址,假設p1的地址是1000,數(shù)組大小為20個字節(jié),所以指向的地址為1020。前面加上(int *)是訪問地址(1020)的內存空間,打印的p1[-2] ,是將p1指向的地址減去兩個int類型的位置,也就是1012(1020-4*2)的位置,再對這個地址進行解引用,打印的是4。
*p2首先是將首地址強轉成(int*)的指針類型,然后指針加一,對應的地址是1004(1000+4),這里的4指的是指針的大小,而不是int類型的大小。最后強轉成(int*)類型。
*p3是首地址1000強轉成int類型,加上一為1001(1000+1),再強轉成(int*)類型。指針所占空間為4個字節(jié),所以打印的地址為1001-1005之間的內存空間。按猜想應該打印出來的數(shù)字為2,但是在PC機上,使用的是大端儲存數(shù)據(jù),也就是高地址存儲大數(shù)據(jù),小地址存儲小數(shù)據(jù)。所以這四個小內存塊的順序是反過來的,打印的值是2000000.。
?
?
?
總結
- 上一篇: 杭州师范大学c语言程序设计机试,2016
- 下一篇: android判断usb已连接,andr