数组和指针并不同
来源:互联网 发布:国际卫生统计网络直报 编辑:程序博客网 时间:2024/05/02 01:23
问题:
文件1:
int mango[100];
文件2:
extern int *mango;
...........
这里,文件1定义了数组mango,但文件2声明它为指针。这有什么错误吗?
在回答这个问题之前我们来看一下:
图1 对数组进行下标引用
图2 对指针进行下标引用
在一个文件
对照图1的访问方式:
char *a=”abcdefgh”; ......a[3]
对照图2的访问方式:
char *p=”abcdefgh”;.......p[3]
在这两种情况下,都可以取得字符‘d’,但两者途径是不同的。
如果在另外文件声明 external char *p,然后用p[3]来引用其中的元素,不管p原先定义是指针还是数组,都会按照如下步骤进行操作:
1. 取得符号表中的p的地址,提取存储于此处的指针
2. 把下标所表示的偏移量和指针值相加,产生一个地址。
3. 访问上面这个地址,取得字符
但是只有当p原来定义为指针时这个方法才是正确的。考虑一下p在这里被声明为external char* p;而它原来的定义是char[10];这种情形。当用p[i]这种形式提取这个声明的内容时,实际上得到的是一个字符。但按照上面的方法,编译器却把它当成了一个指针,把字符解释为地址显然是不对的,所以程序出错。
问题解决:
使声明与定义匹配
文件1:
int mango[100];
文件2:
extern int mango[ ];
……..
数组与指针其他区别:
指针
数组
保存数据的地址
保存数据
间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。
如果指针有一个下标[ I],就把指针的内容加上I作为地址,从中提取数据
直接访问数据,a[I]只是简单地以a+I 为地址取得数据
通常用于动态数据结构
通常用于存储固定数目且数据类型相同的元素
相关的函数malloc(),free()
隐式分配和删除
通常指向匿名数据
自身即为数组名
那什么时候数组与指针相同呢?
1.“表达式中的数组名”就是指针(在编译器里最终形式都是指针)
2.C语言把数组下标作为指针的偏移量(指针和偏移量是底层硬件所使用的基本模型)
3.“作为函数参数的数组名”等同于指针(出于效率的考虑)
参考《C专家编程》
- 数组和指针并不同
- 《C专家编程》数组和指针并不同--多维数组
- 数组和指针并不相同
- 数组和指针并不相同
- Chapter_04 数组和指针并不相同
- 令人震惊的事实:数组和指针并不相同
- <技术篇-技巧一>数组和指针并不相同
- C专家编程-数组和指针并不相同
- 指针和数组名的实质区别(并不是一回事)
- C专家编程——令人震惊的事实:数组和指针并不相同
- 【C专家编程】第4章 数组和指针并不相同
- 《C专家编程》学习笔记(令人震撼的事实:数组和指针并不相同)
- C专家编程》笔记三:第四章 数组和指针并不相同
- 令人震惊的事实:数组和指针并不相同——C专家编程
- 指针和指针数组
- 指针数组和数组指针
- 指针数组和数组指针
- 指针数组和数组指针
- linux安装redis服务以及php redis扩展
- Java面试题目
- js继承的实现
- IScroll 无法上下滚动问题
- 好网址
- 数组和指针并不同
- 1691: [Usaco2007 Dec]挑剔的美食家
- CSS控制字体
- 【Foundation-18-2】NSDate.h - 时间操作
- Thread.UnCaughtExceptionHandler接口,为每一个Thread对象创建一个异常处理器
- 邮箱的正则表达式
- 数据结构考研复习--线性表1
- Android分享一款漂亮的折叠书架菜单
- 重温排序法之--快速排序法