| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6872 人关注过本帖
标题:数组的定义,引用
只看楼主 加入收藏
qq918911212
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-11-16
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:3 
数组的定义,引用
学C的时候好多人都觉得指针是难点,还有的觉得文件是难点,我学了这么久了,文件指针都能够理解,就是数组搞不懂,请教下为什么,该如何让自己把数组搞懂啊?   我努力过了
搜索更多相关主题的帖子: 如何 
2011-12-28 15:45
利剑长风
Rank: 2
等 级:论坛游民
帖 子:11
专家分:32
注 册:2011-12-18
收藏
得分:3 
是字符数组吧?我之前也是感觉这里难。后来就不觉得了、多问问就能理解了。呵呵!
2011-12-28 17:44
燃高
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:140
注 册:2011-12-13
收藏
得分:3 
多做做这方面的题目吧!!要不断的练习呢!!
2011-12-28 19:02
kennel2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:45
专家分:157
注 册:2011-12-13
收藏
得分:3 
这种问题咋回答?举个例子吧
#include<stdio.h>
main()   
{   
 int a[5]={1,2,3,4,5};
 int *ptr=(int *)(&a+1);
 printf("%d,%d\n",*(a+1),*(ptr-1)); //2, 5
}
在一般上下文中,对数组的引用会退化为指针,例如:
int a[5];
int *p = a + 1;
在这代码中,第二行对a的引用退化为一个指针,指针类型为int。
在&a这样的表达式中数组退化为指针的规则则不再使用。作为一个整体,&a也表示一个指针,它与a不同的就是:a的指针类型为int,而&a的指针类型为int[5]。
-------------------------------------------------
1)在c语言中,并没有真正的数组类型,大部分对数组的引用会退化为指针
2)多位数组的情况:
   例如int a[x][y];
   则a退化为指针类型是int[y],&a的类型则是int[x][y]
3)数组退化为指针的规则不能递归应用。数组的数组退化为数组的指针,而不是指针的指针。
如果你向函数传递一个二维数组,例:
int a[x][y];
f(a);
则f必须声明成
int f(int a[][y]);

int f(int (*a)[y]);
而不能是
int f(int **a);
-----------------------------------
要想真正理解数组,必须明白在表达式中出现a,a退化为指针

“数组名“之所以为常量是因为它不能被赋值,但!!数组不是指针!!。数组只是在表达式中出现时退化为指针,而指针&p与数组&a则是截然不同的行为,这正说明数组不是指针。
例如 int *p = (int *) 111;
那么p是111,而&p则是p的地址(可能为0x00122222),
但对于数组 int a[6];
若a是0x00123333,则&a也是0x00123333,只是这两者的指针类型不同
-----------------------------------------------
另外,在参数传递时数组也经常令人困惑
例如int f(char a[]);这种类型的声明,编译器内部将它当作int f(char *a);
所以可以对它传入指针。若对它传入数组,则数组退化为指针所以参数类型检验才能通过。
所以你即使声明int f(char a[4]);看上去a是个数组,在函数体内写a = 1;则违反了数组名是常量的规则,其实a = 1;是允许的因为int f(char a[4]);在编译器看来是int f(char *a);其中的4被忽略了

最后一点要注意的是在一个源文件中定义int a[5];
而在另一个源文件1中写下extern char *a是不合法的
因为数组与指针是两个类型
-----------------------------------------------
最后罗索一句,&a[0]倒是和一般上下文中a等价都是int型指针。而&a则是int[5]型指针。

如果满意,别忘记分哦 ..
2011-12-28 22:21
快速回复:数组的定义,引用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043683 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved