首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数组和指针有关问题()

2012-02-08 
数组和指针问题(请教高手)1.既然数组是直接访问数据,但指针是间接访问数据,那我就想数组效率应该比指针好

数组和指针问题(请教高手)
1.既然数组是直接访问数据,但指针是间接访问数据,那我就想数组效率应该比指针好一点吧?

2.但是我又想到数组在大多数情况下和指针相同,而且编译器对数组的引用如a[i]在编译时总是被编译器编译成*(a+i)的指针形式.

如果我上面说的2个问题没有错的话?我想问下到底是数组方式还是指针方式效率好点?

如何上面2点有错的,也请指出.谢谢了!

还有请问有没有这方面比较深刻的书籍,介绍一下,非常感谢!

       



[解决办法]
1。有时候编译器会优化,还有时候指针能完成数组所不能的访问
2。效率的讨论脱离了上下文是没有意义的~
编译器比我们想像得要做得多~
[解决办法]
1.既然数组是直接访问数据,但指针是间接访问数据,那我就想数组效率应该比指针好一点吧?

数组访问数据,
最终还是转化到指针方式访问的。

所以不考虑优化的话,
还是指针快。

但是一般编译器都会做优化,不需要考虑这个问题。
[解决办法]
后面的问题好像也不用说了 .......
[解决办法]
访问数组应该能不是直接访问,也是依靠指针访问的。所以效率应该是一样。
[解决办法]
看一下这个
http://hi.baidu.com/wangxinran/blog/item/3a9909faeae9c39658ee9028.html
[解决办法]
< <c专家编程> > 有详细的讨论
[解决办法]
你第二点就是答案吧,数组其实就是一个指针的别名,a[i]:a是首地址,i是位移量,而[]是地址转换符,终究会转换成你说的*(a+i)的.
不过你说到效率问题,不能纯粹的说谁的高,要看具体的吧
不过我举不出例子 我也是新手 呵呵
[解决办法]
在访问数据的方式上,数组和指针应该没有什么大差别吧,毕竟数组是指针经过了一个应用概念的包装之后的东西。说道访问效率,我觉得应该没有什么大差别吧。
[解决办法]
1.既然数组是直接访问数据,但指针是间接访问数据,那我就想数组效率应该比指针好一点吧?
数组直接,指针间接,这是站在程序员的角度上看的。
站在机器的角度,则是反过来的。
[解决办法]
回复人:jixingzhong(瞌睡虫·星辰) ( 四星(高级)) 信誉:100 2007-08-02 12:36:31 得分:0
?
1.既然数组是直接访问数据,但指针是间接访问数据,那我就想数组效率应该比指针好一点吧?

数组访问数据,
最终还是转化到指针方式访问的。

所以不考虑优化的话,
还是指针快。

但是一般编译器都会做优化,不需要考虑这个问题。
=====================================
存疑,先留个爪印
[解决办法]
指针和数组根本的不同是,指针有它本身存储的地方.访问时的效率应该没有差别,但指针有更大的灵活性.
比如说
int a[100];
int *p=a;
for(int i=0;i <100;i++)//
a[i]=i;
for(int i=0;i <100;i++)//这两个实际上是一样的,不存在效率差别.
p[i]=i;

但指针典型的用法是需要动态内存的地方.
int *p=(int* )malloc(n);这时和数组比起来,获得内存的时候要花费很多时间.
for(int i=0;i <n;i++)
p[i]=i; //但获得内存之后对内存的访问也跟数组一样,没有差别.
[解决办法]
数组指向的地址编译期就能确定
而指针指向的地址在内存中,多了一次访址动作,才能确定
对比下面代码的汇编代码就可以看出端倪,不知道我说的对不对
#include <stdio.h>

int
main(void)
{
//int a[10]; //数组时
int *a; //指针时
int m;

m = (int)getchar();
m = a[m];

return 0;
}

[解决办法]
看C专家编程吧 说得很详细
[解决办法]



int main()
{
int* p = new int[1000];
int a[1000];

....


如上面一般情况下 指针p比数组a慢

因为p在堆上

访问p可能涉及到换页之类


--------


测试


去掉优化选项


#include "windows.h "
#include "iostream "


int main()
{


int* p = new int[1000];
int a[1000];

DWORD s = GetTickCount();

for (int v = 0; v < 10000; v++)
for (int i = 0; i < 1000; i++)
a[i] = 0;

DWORD d = GetTickCount();

std::cout < <d -s < <std::endl;


DWORD s1 = GetTickCount();

for (int v = 0; v < 10000; v++)
for (int i = 0; i < 1000; i++)
p[i] = 0;

DWORD d1 = GetTickCount();

std::cout < <d1 -s1 < <std::endl;


return 0;
}
[解决办法]
int main()
{
int* p = new int[1000];
int a[1000];

....


如上面一般情况下 指针p比数组a慢

因为p在堆上

访问p可能涉及到换页之类

====================================================
请问楼上:既然p是堆空间的地址,p也成功的申请了1000 个int型的内存单元,
访问p怎么会产生换页?
我不同意您的看法。

[解决办法]
汗。。。

用不着这么深刻吧。。。
[解决办法]
ls的就不对了, 就是需要深刻的理解。。
绝对需要。


[解决办法]
1、单纯的数组操作要比指针高,就像a[i]和p[i],当然是a[i]快。
但在编程使用时,要看上下文的。
2、是对的。但*(p+i)和*(a+i)是有区别的。
[解决办法]
牵扯到编译,及操作系统的一些东西,自己多花时间看点吧
[解决办法]
纯粹从访问步骤上来说我也觉得数组应该比指针快些。
数组名直接就代表这个数组的首地址,取数组元素的时候只需要 mov eax, [array + offset] 就可以了。
而指针是在一块内存里面放了一个指向其它地址的内容,先要访问一次指针所在的内存,把它的值取出来做为一个地址来加上偏移,多了一步 mov eax, [[pointer] + offset]

ps.汇编不熟悉,代码只做说明,不一定合法。

热点排行