2

我是 C 世界的新手。我是自学的,希望能在几个问题上得到帮助。

该程序是本示例中编写的程序的简化变体,用于演示指针与结构数组的使用。我无法理解的事情是:

  1. 数组如何在第一个 for 循环中递增。运算符直接用于结构数组,而++我预计需要in_p[i]在循环内部执行更多操作(i 是一个递增的 int)。
  2. 在此循环中进行比较的方式。我不认为这in_p < &ar[ARSIZE]是可能的,因为两者都是 type struct wp_char。这里实际比较的是什么?

本书中的示例和我的示例都可以编译和运行。

谢谢你。

#include <stdio.h>
#include <stdlib.h>

#define ARSIZE 5

struct wp_char{
      char wp_cval;
      short wp_font;
      short wp_psize;
}ar[ARSIZE];

void infun(struct wp_char *, char cval, int font, int psize);

int main(void)
{
    struct wp_char wp_tmp, *lo_indx, *hi_indx, *in_p;
    char c[] = {'a','b','c','d','e'};
    int i1[] = {2,3,4,5,6};
    int i2[] = {7,8,9,10,11};
    int i = 0;

    for(in_p = ar; in_p < &ar[ARSIZE]; in_p++){
        infun(in_p, c[i], i1[i], i2[i]);
        i++;
    }

    int j;

    for(j=0;j<ARSIZE;j++)
    {
        printf("%c\n",c[j]);
        printf("%d\n",i1[j]);
        printf("%d\n",i2[j]);
        puts("\n");
    }

    exit(0);
}

void infun( struct wp_char *inp, char cval, int font, int psize)
{
`
      inp->wp_cval = cval;
      inp->wp_font = font;
      inp->wp_psize = psize;

      return;
}
4

1 回答 1

3

问题一:

在 C 指针算术中,++ 和 -- 按所指向事物的大小而不是字节(或其他一些任意度量)来递增和递减指针。参见例如http://www.eskimo.com/~scs/cclass/notes/sx10b.htmlhttp://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html

请注意,这也适用于普通的旧加法和减法:

float x[10];
float xPtr = &x[0];  // OR could write simply "float xPtr = x;"

xPtr = xPtr + 1; // xPtr now points at x[1]
xPtr = xPtr - 1; // xPtr now points at x[0] again
xPtr = xPtr + 9; // xPtr now points at last item in the array, x[9]

问题2:

它们不是 type struct wp_char,它们是 type struct wp_char*,即指向该结构的指针。将它们视为指向包含这些结构之一的内存位置的数字。您可以比较两个内存位置是否相等。

于 2013-02-24T11:13:02.643 回答