2

私はCの世界の新参者です。私は自習しているので、いくつか質問があれば助けていただければ幸いです。

このプログラムは、構造体の配列でのポインターの使用を示すために、この例で記述されたものの単純化されたバリエーションです。頭を動かすのに苦労しているのは次のとおりです。

  1. 最初のforループで配列がどのようにインクリメントされるか。演算子は構造体の++配列で直接使用されますが、ループ内でもっと何かをする必要があると予想していましin_p[i]た(iはインクリメントされるintです)。
  2. このループで比較が行われる方法。in_p < &ar[ARSIZE]どちらもタイプなので、それが可能だとは思いませんでした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

質問1:

C ポインター演算では、++ と --は、バイト (またはその他の任意の尺度) ではなく、指している対象のサイズによってポインターをインクリメントおよびデクリメントします。たとえばhttp://www.eskimo.com/~scs/cclass/notes/sx10b.htmlおよびhttp://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:

それらは typestruct wp_charではなく、 type struct wp_char*、つまりその構造体へのポインターです。それらは、それらの構造体の 1 つを含むメモリ位置を指す数値と考えてください。2 つのメモリ位置が等しいかどうかを比較できます。

于 2013-02-24T11:13:02.643 に答える