數(shù)組和指針再次來(lái)襲 -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【clearvueentertainment.com - 電腦資料】

    1,數(shù)組和指針的定義于聲明:

    定義:只能出現(xiàn)一次,用來(lái)確定對(duì)象的類型和大小,并為其分配空間,

數(shù)組和指針再次來(lái)襲

。

    聲明:可以出現(xiàn)多次,描述對(duì)象的類型,用于指定其他地方定義的對(duì)象,不為對(duì)象分配空間。

    所以說(shuō)extern char a[]與extern char a[10]等價(jià),因?yàn)檫@是聲明,不分配空間。

    看一個(gè)關(guān)于數(shù)組指針的例子:

    例1:

   

#include<stdio.h>int main(){    char a[5] = { 'A', 'B', 'C', 'D' };    char(*p3)[4] = &a;//這樣的賦值不合理,數(shù)組a有5個(gè)元素,而p3是一個(gè)包含4個(gè)元素的數(shù)組指針。    char(*p4)[5] = a;//p4用來(lái)存放數(shù)組地址,a代表數(shù)組首元素的地址,所以類型不匹配    return 0;}

    如果將&a強(qiáng)制類型轉(zhuǎn)換為(char (*)[4])&a后就可以賦值給char (*p)[4]了,p4+1相當(dāng)于加了4個(gè)字節(jié),而不是5,因?yàn)閜4的大小為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;//假設(shè)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;}

    結(jié)果分析:p的地址為1ef7f4,p里面存放的是結(jié)構(gòu)體的地址,所以p+0x1就要加一個(gè)結(jié)構(gòu)體的大小20,轉(zhuǎn)換為16進(jìn)制,結(jié)果就是1ef808,

電腦資料

數(shù)組和指針再次來(lái)襲》(http://clearvueentertainment.com)。將p轉(zhuǎn)化為無(wú)符號(hào)長(zhǎng)整型,加1就是直接加十進(jìn)制1,結(jié)果就是1ef7f5。將p轉(zhuǎn)換為整型指針,占四個(gè)字節(jié),加1就相當(dāng)于加1*sizeof(int *),結(jié)果就是1ef7f8。

    例3:vs2013中小端存儲(chǔ):

   

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;}

最新文章