免费注册 查看新帖 |

Chinaunix

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

疯了.指针还是数组?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-25 18:58 |只看该作者 |倒序浏览
main
{

int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};

  printf("here");
  foo(a);


}



void foo( int b[3][3])  
{
   
  printf("\n%d\n" ,b);
  printf("\n%d\n" ,b[0]);
//   ++ (b[0]);  为什么这个不能自加..                怎么理解传入的参数 ?
      ++ b;

}



如下结果:
here
-1080975640

-1080975640

论坛徽章:
0
2 [报告]
发表于 2010-10-25 19:31 |只看该作者
你printf("\n%d\n" ,b);
这样打印打出来的是数组b的首地址。而你printf("\n%d\n" ,b[0]); 这样打印打出的是数组b[0]的首地址
你要想打印出数组里的东西应该是printf("\n%d\n", b[i][j];而你所为的自加指的是指针,你现在用的是数组。
你可以定义
int **p=&b;
int *p2=*p;
++p;
++p2;

论坛徽章:
0
3 [报告]
发表于 2010-10-25 19:50 |只看该作者
概念问题... 数组名不是变量... 仅仅只是一个符号而已... 怎么能够对符号进行基本的运算呢?
    即便你的foo()函数的参数b[3][3]在被调用的时候.b在堆栈中有对应的内存。但是你的声明参数的方式告诉编译,b也只是一个数组名, 并非变量。
比如汇编中...
.global foo
foo:
   .byte  1, 2, 3, 4, 5;

你可以在C语言中用foo[i]来访问 1, 2, 3, 4, 5
但是不能够foo++, foo只是一个符号. foo++是什么呢?  记住。必须对变量进行基本操作。

论坛徽章:
0
4 [报告]
发表于 2010-10-30 01:16 |只看该作者
本帖最后由 xiaolzz 于 2010-10-30 01:21 编辑

我把你的程序保存成C文件,在linux下编译成可执行文件后用gdb调试,我在foo函数中++b哪里设置了一个断点,调试截图如下

可以看到foo(int  b [3][3])这个函数将参数b解释为int(*)[3]的格式, 也就是int*    b [3]。但实际上b不是一个数组名, 它实际上是一个指针变量(想问为什么么?因为他是参数b=a,a才是数组名),b的类型为int(*)[3]。所以它可以执行++b。而b[0]被解释为一个常量,常量又如何可以自加呢?, 所以报错。(也许3楼表达了和我一样的观点, 不过我比较愚钝, 需要借助调试才能看出来,不像那些高手啊, 呵呵)
我也不知道自己讲得是否完全正确, 如果你还是觉得迷惑的话, 去这里看看http://learn.akae.cn/media/ch23s06.html

论坛徽章:
0
5 [报告]
发表于 2010-11-01 23:42 |只看该作者
数组名不是变量,是个常量指针

论坛徽章:
0
6 [报告]
发表于 2010-11-02 20:18 |只看该作者
++ b;??

b是变量么?

论坛徽章:
0
7 [报告]
发表于 2010-11-03 13:43 |只看该作者
b确实是个变量   类型为int(*)[3]    但是b[0]不是, b[0]相当于*(b+0), b[1]相当于 *(b+1), 因此不能对b[0]进行自增操作, 因为b[0]不是一个变量了,而是一个表达式

这是我的理解 不知道有没有错

论坛徽章:
0
8 [报告]
发表于 2010-11-03 13:53 |只看该作者
基础啊基础

论坛徽章:
0
9 [报告]
发表于 2010-11-03 15:49 |只看该作者
钱能 那本 C++教程 对这个说的比较明白。找找书看看这些基础,再结合程序调试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP