免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1916 | 回复: 2

[C] 老问题了但确实想不明白,看谁能解释清楚! [复制链接]

论坛徽章:
0
发表于 2008-01-10 20:58 |显示全部楼层
10可用积分

  1. 关于数组指针的问题
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. static void print_string(char (*a)[]);

  5. int main(void)
  6. {
  7.         char            str[10] = "12345678";
  8.         char            (*a)[10] = &str;//注意:两个[]内的数值要相等

  9.         printf("%u, %u, %u, %u\n", a, a[0], &a[0], &a[0][0]);
  10.         print_string(a);

  11.         exit(0);
  12. }

  13. static void print_string(char (*a)[])
  14. {
  15.         printf("1: %s\n", a);
  16.         //printf("2: %s\n", a[0]);
  17.         //printf("3 %s\n", &a[0]);
  18.         //printf("4: %s\n", &a[0][0]);
  19. }

复制代码





其中:&str表示数组str[]的地址,所以用数组指针a指向它。
所以在这个程序中:
a表示数组str[]的地址
a[0]即*(a+0)表示数组str[]第一个元素的地址,也就是&a[0][0]
同理&a[0]和a一样,表示数组str[]的地址,
所以a, a[0],&a[0], &a[0][0]它们4个的值是一样的。
不明白为什么只有第一个printf("1: %s\n", a);可以正确执行呢?
而其它3条却无法通过编译
static void print_string(char (*a)[])

{

        printf("1: %s\n", a);

        //printf("2: %s\n", a[0]);

        //printf("3 %s\n", &a[0]);

        //printf("4: %s\n", &a[0][0]);

最佳答案

查看完整内容

嗯. 是的, 上面也讲了这个的.

论坛徽章:
0
发表于 2008-01-10 20:58 |显示全部楼层

回复 #2 xiaozhu2007 的帖子

嗯. 是的, <C专家编程>上面也讲了这个的.

论坛徽章:
0
发表于 2008-01-10 21:18 |显示全部楼层

终于想明白了

呵呵,我明白是怎么回事了。
正确的形参可以是:
static void print_string(char (*a)[10])
static void print_string(char a[][10])
不管哪一种第2维必须是10,因为实参是一个数组指针,相当于仅有1行的二维数组,
而后三种  
     //printf("2: %s\n", a[0]);
     //printf("3 %s\n", &a[0]);
     //printf("4: %s\n", &a[0][0]);
无意列外的都涉及到数组下标的偏移计算,所以在参数声明的时候必须给出除第一维以外的所有其它维的下标。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP