1. 指针数组与数组指针的内存布局
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定
数组指针:首先它是一个指针,它指向一个数组,在32位系统下永远占4字节
数组指针可以这么定义:int (*)[5] p,其中int (*)[5]为类型名,p为指针变量
2.指针数组与数组指针的理解
char a[5] = {'A','B','C','D'};
char (*p3)[5] = &a;
char (*p4)[5] = a;
&a是数组的首地址,而a是数组首元素的首地址,值相同但意义不同。在C中,赋值号“=”两边的类型必须是相同的
p3这个定义“=”两边的数据是一致的,而p4却不一致,因为左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针
3. 地址强制转换(题目)
题2:
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);
return 0;
}
解析:
ptr1:&a + 1 指向下一个数组的第一个元素,即a[5],而ptr1[-1] = *(ptr1 - 1) = 0x4
ptr2:(int)a + 1:a在这里是数组首元素的首地址,即&a[0],(int)a是一个整型数,即ptr2指向元素a[0]的
第二个字节
其内存布局如下图所示:
这时要考虑大小端了,写一个检查大写端的函数,然后确定其值即可
*************************************************************************************************