Chinaunix

标题: 请教一个数组指针的问题 [打印本页]

作者: hiliunx    时间: 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];


请大侠指教
作者: 没本    时间: 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类型。
作者: 群雄逐鹿中原    时间: 2010-07-05 18:42
左右法则吧。这种事情我学不会,一般多写几个typedef
作者: hiliunx    时间: 2010-07-05 19:11
回复 2# 没本


    谢谢
作者: chenzhanyiczy    时间: 2010-07-05 19:39
typename (*p) [N] 这种形式在用来把一大块内存切成多份,每份都是sizeof(typename[N])大小时很方便。
p指 ...
没本 发表于 2010-07-05 18:40



    错了
作者: chenzhanyiczy    时间: 2010-07-05 19:42
&(*p)[1] =>  &*((*p)+1)  -> 就是第二个元素的地址
作者: 没本    时间: 2010-07-05 19:43
回复 5# chenzhanyiczy


    可能说法上有些问题吧,总之大致就是那个意思,指针总是很绕的,我也是写了又改的,有错难免,意思到了就行了。
作者: 没本    时间: 2010-07-05 19:46
&(*p)[1] =>  &*((*p)+1)  -> 就是第二个元素的地址
chenzhanyiczy 发表于 2010-07-05 19:42



    你的表诉也不准确吗,什么叫第二个元素,到底是指向 char [2]的第二个元素,还是char[]的第二个元素,还是的二个char[2]块?
是吧,你写点东西不就知道了,这个并不好写。
作者: chenzhanyiczy    时间: 2010-07-05 20:01
char a[2][2];

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

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

对于上面这个,你的理解是不是相同?
作者: 没本    时间: 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. */
复制代码

作者: pmerofc    时间: 2010-07-06 06:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: liwangli1983    时间: 2010-07-06 10:25
第二个值是10...真是的,从指针到数组再对数组元素取地址再强制类型转换......




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2