请教一个数组指针的问题
时间:2010-07-05
来源:互联网
int a=9;
请问一下下面这两个式子怎么理解。
1. char (*ptr)[2] = (char (*) [2])a;
2. (int)&(*ptr) [1];
请大侠指教
作者: hiliunx 发布时间: 2010-07-05
typename (*p) [N] 这种形式在用来把一大块内存切成多份,每份都是sizeof(typename[N])大小时很方便。
p指向这个大块内存块的开头。这大块内存可以看作被切成很多小块,每小块大小是sizeof(typename[N])。
p[0]指向的与p相同的地址,不同的是指针指向的对象不同,p[0]是类型为typename[N]的第一块,也就是很多小块中的第一小块。
*p是p[0]的另一种等价写法。
p[1]则是与p[0]间隔sizeof(typename[N])的下一小块。
在这个例子里面,*p(也即是p[0])是一个 char[2]类型,是一个长度为2的数组,也可以当成是一个指针(具体的可以查一下看C语言的数组和指针的区别),记为pc。
那么 (*p)[1]就是pc[1],或等价写为*(pc+1)。
(int)&(*p)[1]就是(int) (pc+1),由于pc是char[2]类型,每个元素的尺度是sizeof(char)==1,pc+1就是9+1==10,这是一个地址转为int类型。
作者: 没本 发布时间: 2010-07-05
作者: 群雄逐鹿中原 发布时间: 2010-07-05
谢谢
作者: hiliunx 发布时间: 2010-07-05
p指 ...
没本 发表于 2010-07-05 18:40
错了
作者: chenzhanyiczy 发布时间: 2010-07-05
作者: chenzhanyiczy 发布时间: 2010-07-05
可能说法上有些问题吧,总之大致就是那个意思,指针总是很绕的,我也是写了又改的,有错难免,意思到了就行了。
作者: 没本 发布时间: 2010-07-05
chenzhanyiczy 发表于 2010-07-05 19:42
你的表诉也不准确吗,什么叫第二个元素,到底是指向 char [2]的第二个元素,还是char[]的第二个元素,还是的二个char[2]块?
是吧,你写点东西不就知道了,这个并不好写。
作者: 没本 发布时间: 2010-07-05
char (*p)[2]=a[0];
&(*p)[1] -> 取得的是a[0][1]的地址
对于上面这个,你的理解是不是相同?
作者: chenzhanyiczy 发布时间: 2010-07-05
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- int main()
- {
- const size_t c = 16;
- const size_t b = 4096;
- char (*s) [4096];
- size_t i;
- s = malloc(b*c);
- for( i=0; i<c; ++i )
- memset(&s[i], i, b);
- for( i=0; i<c; ++i )
- printf("%d %d\n", s[i][0], s[i][b-1]);
- assert( (size_t)(s)+b*c-1==(size_t)&(s[c-1][b-1]) );
- free(s);
- return 0;
- }
- /*
- $ gcc aa.c -o aa
- $ ./aa
- 0 0
- 1 1
- 2 2
- 3 3
- 4 4
- 5 5
- 6 6
- 7 7
- 8 8
- 9 9
- 10 10
- 11 11
- 12 12
- 13 13
- 14 14
- 15 15
- $
- */
作者: 没本 发布时间: 2010-07-05
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28