通过内存地址遍历数组元素。(C语言)

3
我是一名有用的助手,可以为您翻译文本。
我是新手学习C语言。我有一个由1024个十六进制数字组成的const unsigned short数组。每个十六进制数字表示8位,并代表在向GBA屏幕显示图像时要打开和关闭的位。但请不要介意这一切以及我下面提供的DMA语法,这只是为了参考!
我的主要问题是...如何通过地址迭代数组元素,获取这些内容,然后继续递增地址?此外,如果您能看一下下面的代码,也许可以看出我为什么会得到:
"Program.c:(.text+0xe8): undefined reference to `myimg'" 

在调用“drawImage3”函数的那一行,这将很棒。

(在程序C的主函数中):

const unsigned short *pt;  
pt = &myimg[0]; 
int size = 5;
drawImage3(15,15,img_WIDTH,img_HEIGHT, pt);

(在其他地方定义):
void drawImage3(int x, int y, int width, int height, const u16* image)
{
    int r;
    for (r=0; r<height; r++)
    {   
        DMA[3].src = &image;
        DMA[3].dst = &videoBuffer[OFFSET(x+width, y, 240)];
        DMA[3].cnt = width | DMA_SOURCE_FIXED | DMA_ON |   DMA_DESTINATION_INCREMENT;  
        image++;    
    }
}
2个回答

1

您正在将DMA [3] .src设置为指针的地址,这可能不是您想要做的。 为了清晰起见,这里是这些引用的含义:

*image    -- the value of the thing which image points to
 image[0] -- same as *image
 image    -- the location in memory of your thing
&image    -- the location in memory that is storing your pointer
&image[0] -- same as image
&image[n] -- the location of the nth element in your thing

所以,与其使用DMA[3].src = &image;,你可能想要使用以下两种方法之一:

DMA[3].src = &image[r];    # If you do this do NOT increment image

或者

DMA[3].src = image;        # And continue to increment image

如果您选择后者,则
DMA[3].src = image;
image++;

可以更好地写成:

DMA[3].src = image++;

0
从提供的代码来看,myimg 从未被定义(第二个代码块中的第二行)。
至于通过地址循环,数组已经是指针了,所以做一个简单的for循环就相当于在地址上循环。但我不确定你想用“通过地址循环”做什么,因为这就是C已经在做的事情。
编辑:
据我所知,在C中并没有真正的数组,但在C++中有,所以索引到一个“数组”只是说,“给我一个从这个地址开始的内存块,大小为这么多字节*它的大小”。
例如,一个int数组(每个索引4个字节)只是一个内存块,大小为4个字节*索引数。获取这个“数组”的索引只是在内存块中获取一个内存偏移量x个字节*4(int的大小)。
简而言之,你不必太担心它。

不确定这些新潮的术语是什么意思,但在C语言中,数组基本上就是指针。 - Perception
@Jeff Mercado - 我不太同意。在C/C++中,数组(常量指针)和指针比其他支持真实属性的语言中的数组更相似,例如length属性。 - Perception
我认为在C++中,数组更像是数组,因为你可以使用new运算符声明一个“新”的数组。由于在C语言中不存在new关键字,而且在底层“new”只是malloc或类似的东西,所以实际上并没有太大的区别。我只是认为C++更清晰地区分了内存块和“数组”。当然,在C++中,数组不是一个对象,只是一块内存,但在我的看法中,这是一个更清晰的区分。 - beatgammit
@Perception:数组不是指针!数组有一些独特的属性,指针没有。虽然我们可以几乎完全像使用指针一样使用数组,但把它们等同起来是完全错误的。考虑数组和指针的大小。例如,int arr[20]int *ptr(假设是32位架构),sizeof arr 的值是多少?sizeof ptr 的值是多少?不要将C或C++数组与OO语言中的数组对象混淆,这些是完全不同的概念。 - Jeff Mercado
@Perception, tjameson:嗯,我无法说服你们改变看法,所以我不会再拖延这个话题了。我只留下几个链接,希望你们自己能找到真相。(http://www.google.com/search?hl=en&q=arrays+are+not+pointers) (http://c-faq.com/aryptr/aryptrequiv.html) (http://groups.google.com/group/comp.lang.c/msg/687fcae0d3ecb089?hl=en) - Jeff Mercado
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接