免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2993 | 回复: 11
打印 上一主题 下一主题

请教一个数组指针的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-05 18:14 |只看该作者 |倒序浏览
本帖最后由 hiliunx 于 2010-07-05 18:28 编辑

int a=9;

请问一下下面这两个式子怎么理解。

  1.   char (*ptr)[2] = (char (*) [2])a;

   2.  (int)&(*ptr) [1];


请大侠指教

论坛徽章:
0
2 [报告]
发表于 2010-07-05 18:40 |只看该作者
本帖最后由 没本 于 2010-07-05 21:53 编辑

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类型。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2010-07-05 18:42 |只看该作者
左右法则吧。这种事情我学不会,一般多写几个typedef

论坛徽章:
0
4 [报告]
发表于 2010-07-05 19:11 |只看该作者
回复 2# 没本


    谢谢

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
5 [报告]
发表于 2010-07-05 19:39 |只看该作者
typename (*p) [N] 这种形式在用来把一大块内存切成多份,每份都是sizeof(typename[N])大小时很方便。
p指 ...
没本 发表于 2010-07-05 18:40



    错了

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
6 [报告]
发表于 2010-07-05 19:42 |只看该作者
&(*p)[1] =>  &*((*p)+1)  -> 就是第二个元素的地址

论坛徽章:
0
7 [报告]
发表于 2010-07-05 19:43 |只看该作者
回复 5# chenzhanyiczy


    可能说法上有些问题吧,总之大致就是那个意思,指针总是很绕的,我也是写了又改的,有错难免,意思到了就行了。

论坛徽章:
0
8 [报告]
发表于 2010-07-05 19:46 |只看该作者
&(*p)[1] =>  &*((*p)+1)  -> 就是第二个元素的地址
chenzhanyiczy 发表于 2010-07-05 19:42



    你的表诉也不准确吗,什么叫第二个元素,到底是指向 char [2]的第二个元素,还是char[]的第二个元素,还是的二个char[2]块?
是吧,你写点东西不就知道了,这个并不好写。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
9 [报告]
发表于 2010-07-05 20:01 |只看该作者
char a[2][2];

char (*p)[2]=a[0];

&(*p)[1]  -> 取得的是a[0][1]的地址

对于上面这个,你的理解是不是相同?

论坛徽章:
0
10 [报告]
发表于 2010-07-05 20:29 |只看该作者
我一般是这么用的。s[0]到s[15]被切分为16个4096字节的内存块,是连续的。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. int main()
  6. {
  7.         const size_t c = 16;
  8.         const size_t b = 4096;
  9.         char (*s) [4096];
  10.         size_t i;
  11.         s = malloc(b*c);
  12.         for( i=0; i<c; ++i )
  13.                 memset(&s[i], i, b);
  14.         for( i=0; i<c; ++i )
  15.                 printf("%d %d\n", s[i][0], s[i][b-1]);
  16.         assert( (size_t)(s)+b*c-1==(size_t)&(s[c-1][b-1]) );
  17.         free(s);
  18.         return 0;
  19. }
  20. /*
  21. $ gcc aa.c -o aa
  22. $ ./aa
  23. 0 0
  24. 1 1
  25. 2 2
  26. 3 3
  27. 4 4
  28. 5 5
  29. 6 6
  30. 7 7
  31. 8 8
  32. 9 9
  33. 10 10
  34. 11 11
  35. 12 12
  36. 13 13
  37. 14 14
  38. 15 15
  39. $
  40. */
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP