c指针、数组(计算大小)
2016-04-23 16:18
302 查看
摘自《C语言深度剖析》
1、先将地址 0x12ff7c 强制转换,告诉编译器这个地址上将存储一个 int 类型的数据;然后通过钥匙“ *”向这块内存写入一个数据。
2、指针和数组不一样的
3、&a指的是数组首元素的地址
a指整个数组的首地址
结果:
*(a+1) = 2;
*(ptr-1) = 5;
4、数组指针和指针数组
A), int *p1[10];
指针数组:首先它是一个数组,数组的元素都是指针,数组多少个字节由数组本身决定。它是“储存指针的数组”的简称。
B), int (*p2)[10];
数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
4.1、 a是整个数组的首地址
5、算大小
假设首地址为0x100000
&a+1 指的是,整个数组的大小加1,0x100000+4*sizeof(int)
a+1 指的是,数组首元素首地址加1,0x100000+sizeof(int)
6、算大小
假设 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。
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。
相关文章推荐
- mysql表导出导入测试(utf8-utf8)
- iOS架构师之路:控制器(View Controller)瘦身设计
- 《CSS3实战》笔记--色彩模式和不透明度
- hdu 5672(尺取法)
- hdoj 2111 Saving HDU
- 有关Java链表概念的有趣问题
- Linux yum 软件安装
- Android tips
- 第8周学习进度
- js日期工具
- Vue 计算属性
- 飞机调度
- js第一蛋
- hadoop学习序曲之java基础篇--javaIO流及File类
- 快速排序
- 理解频率与带宽
- Spring调度任务cronjob 精确指定任务的运行时间
- 测试mysql单表排序是否有走索引
- 团队项目个人工作总结(4月23日)
- Spark 机器学习 —— KMeans