通过内存地址迭代数组中的元素。 (C)

时间:2011-07-10 05:28:55

标签: c pointers

我是C的新手。我有一个包含1024个十六进制数的const无符号短数组。每个十六进制数表示8位,表示在向GBA屏幕显示图像时要打开和关闭的位。但是请不要忘记所有这些以及我在下面的DMA语法仅供参考!!

我的主要问题是......如何迭代数组BY ADDRESS中的元素,抓取这些内容,然后继续递增地址?另外,如果您可以盯着下面的代码,也许可以看看为什么我会:

"Program.c:(.text+0xe8): undefined reference to `myimg'" 

在调用“drawImage3”的行上,那将是rad。

(在program.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 个答案:

答案 0 :(得分: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++;

答案 1 :(得分:0)

从提供的代码中,永远不会定义myimg(第二个代码块中的第二行)。

对于按地址循环,数组已经是指针,因此执行简单的for循环与循环地址相同。我不确定你要通过“循环地址”业务来完成什么,因为这就是C已经在做的事情。

编辑:

AFAIK,数组在C中并不存在,但是它们在C ++中存在,所以索引到'数组'只是说,'从这个地址开始给我一块内存,这个字节大小为* ”。

例如,一个int数组(每个索引4个字节)只是一块4 bytes * number of indexes的内存。获取这个'数组'的索引只是将内存偏移x字节* 4(sizeof int)放入内存块。

简单地说,你不必担心它。