c指针、数组(计算大小)

来源:互联网 发布:乐乎pt 编辑:程序博客网 时间:2024/05/28 15:53

摘自《C语言深度剖析》
1、先将地址 0x12ff7c 强制转换,告诉编译器这个地址上将存储一个 int 类型的数据;然后通过钥匙“ *”向这块内存写入一个数据。

*(int *)0x12ff7c = 0x100;

2、指针和数组不一样的
3、&a指的是数组首元素的地址
a指整个数组的首地址
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}

结果:
*(a+1) = 2;
*(ptr-1) = 5;

4、数组指针和指针数组
A), int *p1[10];
指针数组:首先它是一个数组,数组的元素都是指针,数组多少个字节由数组本身决定。它是“储存指针的数组”的简称。

B), int (*p2)[10];
数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

4.1、 a是整个数组的首地址

char a[5] = {'A', 'B', 'C', 'D'};char (*p3)[3] = a;

5、算大小
假设首地址为0x100000

int a[4] = {1,2,3,4};

&a+1 指的是,整个数组的大小加1,0x100000+4*sizeof(int)
a+1 指的是,数组首元素首地址加1,0x100000+sizeof(int)

6、算大小

struct Test{    int Num;    char *pcName;    short sDate;    char cha[2];    short sBa[4];}*p;

假设 p 的值为 0x100000。 如下表表达式的值分别为多少?
p + 0x1 = 0x___ ?
(unsigned long)p + 0x1 = 0x___?
(unsigned int*)p + 0x1 = 0x___?
一个指针变量与一个整数相加减,到底该怎么解析呢?
指针变量与一个整数相加减并不是用指针变量里的地址直接加减这个整数。这个整数的单位不是byte 而是元素的个数。所以:
p + 0x1 的值为 0x100000+sizof( Test) *0x1。至于此结构体的大小为 20byte,前面的章节已经详细讲解过。所以 p +0x1 的值为: 0x100014。

(unsigned long)p + 0x1 的值呢?这里涉及到强制转换,将指针变量 p 保存的值强制转换成无符号的长整型数。任何数值一旦被强制转换,其类型就改变了。所以这个表达式其实就是一个无符号的长整型数加上另一个整数。所以其值为: 0x100001。

(unsigned int*)p + 0x1 的值呢?这里的 p 被强制转换成一个指向无符号整型的指针。所以其值为: 0x100000+sizof( unsigned int) *0x1,等于 0x100004

0 0
原创粉丝点击