+ -
当前位置:首页 → 问答吧 → 请教一个数组指针的问题

请教一个数组指针的问题

时间:2010-07-05

来源:互联网

本帖最后由 hiliunx 于 2010-07-05 18:28 编辑

int a=9;

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

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

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


请大侠指教

作者: hiliunx   发布时间: 2010-07-05

本帖最后由 没本 于 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

左右法则吧。这种事情我学不会,一般多写几个typedef

作者: 群雄逐鹿中原   发布时间: 2010-07-05

回复 没本


    谢谢

作者: hiliunx   发布时间: 2010-07-05



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




    错了

作者: chenzhanyiczy   发布时间: 2010-07-05

&(*p)[1] =>  &*((*p)+1)  -> 就是第二个元素的地址

作者: chenzhanyiczy   发布时间: 2010-07-05

回复 chenzhanyiczy


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

作者: 没本   发布时间: 2010-07-05



QUOTE:
&(*p)[1] =>  &*((*p)+1)  -> 就是第二个元素的地址
chenzhanyiczy 发表于 2010-07-05 19:42




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

作者: 没本   发布时间: 2010-07-05

char a[2][2];

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

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

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

作者: chenzhanyiczy   发布时间: 2010-07-05

我一般是这么用的。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. */
复制代码

作者: 没本   发布时间: 2010-07-05