【问题标题】:Array Syntax Confusion in CC中的数组语法混淆
【发布时间】:2014-01-26 16:13:47
【问题描述】:

我正在尝试通过 iTunes 大学/哈佛 CS50 课程自学 C。在其中将编写一个程序来调整位图图像文件的大小。为此,我定义了一个数组(缓冲区)并编写了程序运行所需的代码——它确实有效。但是,我不得不作弊并用谷歌搜索答案,因为我无法弄清楚,而且我不理解解决方案中的特定语法,希望有人能提供帮助。

代码块如下所示,我在 cmets 中添加了我的具体困惑点:

// allocate array to hold scanline pixels - this is the array I define
RGBTRIPLE *buffer = malloc(bi.biWidth * sizeof(RGBTRIPLE));

// declare variable to track position in buffer array
int count;

// iterate over infile's scanlines
for (int i = 0, height = abs(oldHeight); i < height; i++)
{
    // initialize count var to 0
    count = 0;

    // iterate over pixels in scanline
    for (int j = 0; j < oldWidth; j++)
    {
        // temporary storage
        RGBTRIPLE triple;

        // read RGB triple from infile
        fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

        // place pixel in buffer array n times
        for (int k = 0; k < n; k++)
        {
            // below is the confusion. Some sudo code would be great!
            *(buffer+(count)) = triple;
            count++;
        }
    }

【问题讨论】:

  • 这门哈佛课程的标题是“编程范式”吗?还是我将它与斯坦福的视频课程混淆了?如果这是一个穿蓝色衬衫的人在大黑板上说话和画画,请快速点击“停止”,他会说很多废话/错误的假设/不好的做法。
  • 顺便说一句,这不是“sudo 代码”。 “Sudo 代码”将是名为 sudo 的 Unix 根特权实用程序的源代码。你要找的词是“伪代码”。
  • @H2CO3;我想听那个人的。严重地! o.O
  • @hacks 在this video 上查看我的 cmets(以及传入的无知回复)。有了 C99 标准的新副本,任何有中级经验的 C 程序员都可以在这个人的演示中指出几十个错误
  • @H2CO3,我同意,只是看了一眼那个视频,这令人难以置信的模糊、不精确、误导、错误......但几乎从不正确。

标签: c arrays syntax cs50


【解决方案1】:

首先变量buffer 不是数组变量。它是一个指针变量。请记住,数组不是指针
现在一行

 *(buffer+(count)) = triple;  

正在使用指针算法。 buffer 是指向 RGBTRIPLE 类型的指针,在为其分配空间后,它指向该内存的第一个块。将count 的值添加到它会将其递增到下一个块,即给出下一个块的地址。使用 * 运算符取消引用此地址会给出存储在该地址的值。也可以写成

buffer[count] = triple;

【讨论】:

  • 谢谢!这很有帮助。只要知道它被称为“指针算法”就会有所帮助。
【解决方案2】:

请记住,写x[i] 等于写*(x+i),也就是说,将 i 与指针 x 相加并读取(或写入)该地址处的值。所以

*(buffer+(count)) = triple;

等于:

buffer[count] = triple;

还请记住,当您将整数添加到指针时,如在buffer+(count) 中,您将指针递增count*sizeof(element_of_buffer)。如果你正在递增一个 char 指针,这将给指针加 1,如果你对 32 位机器中的整数指针做同样的事情,这将给指针加 4(4 个字节,整数的大小)。这对您来说是透明的,因为指针将始终引用有效的内存位置,即每个元素大小的倍数。

【讨论】:

  • 谢谢。这个解释太棒了,真的帮助我理解它。感谢您抽出宝贵时间提供帮助。
【解决方案3】:

我猜你不明白的部分是这一点:*(buffer+(count))

有几件事要记住,第一是buffer 实际上并不是一个数组,它是一个指向某个内存的指针。但是,指针可以作为数组进行索引,并且随着数组衰减为指针,您可以将数组用作指针。

这里的语法*(buffer + count)buffer[count]是一样的。

琐事时间:由于加法的交换性质,*(buffer + count) 也可以写成*(count + buffer),这导致count[buffer] 是一个有效的表达式。 (是的,这种“向后”的索引方式存在于实际代码中。)

【讨论】:

  • 感谢您的帮助!你解释得很好。
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
相关资源
最近更新 更多