数组和指针再次来袭 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【meiwen.anslib.com - 电脑资料】

    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://meiwen.anslib.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;}

最新文章