1,數組和指針的定義于聲明:
定義:只能出現一次,用來確定對象的類型和大小,并為其分配空間,
數組和指針再次來襲
。聲明:可以出現多次,描述對象的類型,用于指定其他地方定義的對象,不為對象分配空間。
所以說extern char a[]與extern char a[10]等價,因為這是聲明,不分配空間。
看一個關于數組指針的例子:
例1:
#include<stdio.h>int main(){ char a[5] = { 'A', 'B', 'C', 'D' }; char(*p3)[4] = &a;//這樣的賦值不合理,數組a有5個元素,而p3是一個包含4個元素的數組指針。 char(*p4)[5] = a;//p4用來存放數組地址,a代表數組首元素的地址,所以類型不匹配 return 0;}
如果將&a強制類型轉換為(char (*)[4])&a后就可以賦值給char (*p)[4]了,p4+1相當于加了4個字節,而不是5,因為p4的大小為4。
例2:
#include<stdio.h>#include<stdlib.h>struct Test{ int Num; char *pcName; short sDate; char cha[2]; short sBa[4];}*p;int main(){ struct Test test;//假設sizeof(struct Test)=20 p = &test; printf("%x\n", p); printf("%x\n", p + 0x1); printf("%x\n", (unsigned long)p + 0x1); printf("%x\n", (unsigned int*)p + 0x1); system("pause"); return 0;}
結果分析:p的地址為1ef7f4,p里面存放的是結構體的地址,所以p+0x1就要加一個結構體的大小20,轉換為16進制,結果就是1ef808,
電腦資料
《數組和指針再次來襲》(http://salifelink.com)。將p轉化為無符號長整型,加1就是直接加十進制1,結果就是1ef7f5。將p轉換為整型指針,占四個字節,加1就相當于加1*sizeof(int *),結果就是1ef7f8。例3:vs2013中小端存儲:
int main(){ int a[4] = { 1, 2, 3, 4 }; int *ptr1 = (int *)(&a + 1); int *ptr2 = (int *)((int)a + 1); printf("%x,%x", ptr1[-1], *ptr2); system("pause"); return 0;}