免费注册 查看新帖 |

Chinaunix

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

问一下这里指针和数组的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-09 14:27 |只看该作者 |倒序浏览
5可用积分
/*file1.c*/
extern int *array;
int main()
{
    array[0]=1;
    return 0;
}

/*file2.c*/
int array[5]={0};



编译没问题,运行会有段错误
书中的解释是file1.c中的int指针array的值就是file2.c中数组元素array[0]的值,也就是'"0"--空指针。用空指针进行访问自然导致程序运行期的段错误。
觉得讲得不清楚,想问问大家。

我觉得按语法讲应该是int指针array指向的变量的值是0才对

最佳答案

查看完整内容

/*file1.c*/extern int *array;int main(){ array[0]=1; return 0;}/*file2.c*/int array[5]={0};首先我想问一下你是高手还是初学者?如果你是高手的话,我觉得你这段代码列的不完整,没有办法分析.如果你是初学者,我有几个问题?1. 从语法上讲你的代码(只能叫代码,不能叫程序)没有任何语法错误,但是有不好的地方.比如说在.c文件中用extern来声名一个全局变量,我们一般将变量的定义放在.c文件中,如果你定义的变量要提供给另外的. ...

论坛徽章:
0
2 [报告]
发表于 2008-01-09 14:27 |只看该作者
/*file1.c*/
extern int *array;
int main()
{
    array[0]=1;
    return 0;
}

/*file2.c*/
int array[5]={0};


首先我想问一下你是高手还是初学者?
如果你是高手的话,我觉得你这段代码列的不完整,没有办法分析.
如果你是初学者,我有几个问题?

1. 从语法上讲你的代码(只能叫代码,不能叫程序)没有任何语法错误,
但是有不好的地方.比如说在.c文件中用extern来声名一个全局变量,
我们一般将变量的定义放在.c文件中,如果你定义的变量要提供给另外
的.c文件使用,那么就在.h文件中声名此变量,如果不提供给外部,没有
必要这么写:extern int *array;

2. file1.c和file2.c是同一个工程的两个文件吗?

3. file2.c中的array数组是全局还是局部的?

4. 其实你的file2.c根本没有意义, 因为main函数在file1.c,任何C语言
的程序都是从main开始执行,你认为file2.c里的初始化语句会被执行吗?

5.运行时出错的原因是你使用的编译器将全局变量都自动初始化为0(当然
也不是所有的编译器都这么做,但Vc++6.0和gcc是这么做的), 所以
指针array的值是0,在main里的代码array[0]= 1;相当于*(array + 0)= 1;
也就是*array= 1;即*0 = 1;访问地址0,这恐怕是任何具有内存保护机制的
操作系统都不会允许的.

论坛徽章:
0
3 [报告]
发表于 2008-01-09 15:27 |只看该作者
发错版了,版主能不能帮我转到C/C++版,谢谢!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2008-01-11 09:15 |只看该作者
请参阅 comp.lang.c FAQ 相关问题。

论坛徽章:
0
5 [报告]
发表于 2008-01-11 10:07 |只看该作者
数组和指针可以通用,比如这样写 *(array+1) 和 array[1] 是同样的意思。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2008-01-11 17:52 |只看该作者

回复 #4 maxxfire 的帖子

try

  1. char a[20];
  2. char *p;
  3. printf("%d %d\n", sizeof(a), sizeof(p));
复制代码

论坛徽章:
0
7 [报告]
发表于 2008-01-14 23:12 |只看该作者

回复 #5 MMMIX 的帖子

char a[20];
char *p;
printf("%d %d\n", sizeof(a), sizeof(p));

我觉得4楼的说的没错,到于你写的当然也有道理.指针跟数组确定不能混为一谈,但是它们是有
共性的.在实际应用中完全可以如下使用你定义的变量:
{
    char i;

    p = a;

      for (i = 0; i < 20; i++)
   {
      p[i] = i;
   }  

      for (i = 0; i < 20; i++)
   {
      printf ("%d\t", *(a + i));
   }  
   printf ("\n");
}


[ 本帖最后由 chenhj_wo 于 2008-1-14 23:16 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-01-15 01:41 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2008-01-15 01:42 |只看该作者
嗯,与之相关的还有一篇:
http://topic.csdn.net/u/20071013 ... b-28ec0b0a4155.html

都触及到了c/c++的深层,值得一看

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2008-01-15 09:07 |只看该作者

回复 #7 chenhj_wo 的帖子

有共性和它们可以不加区分的交换使用是两回事情。没错,在某些时候下它们是可以交换使用而没有任何问题,但在另外一些情况下则不行。

[ 本帖最后由 MMMIX 于 2008-1-15 09:14 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP