-1

ここで提案されているように、ptrをインクリメントしてその要素にアクセスしようとしているこの配列があります。配列要素にアクセスするさまざまな方法を見つけようとしていますか? ...私は何か愚かなことをしているに違いない...私を助けてください!

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


int main()
{
   int i;

   char *p1 = "Cnversions";  
   char *p2 = "Divided";  
   char *p3 = "Plain";  
   char *p4 = "Solid";  

   char *arr[3];

   arr[0] = p1;
   arr[1] = p2;
   arr[2] = p3;
   arr[3] = p4;



   for(i=0;i<=3;i++)
   {

      printf("string at arr[%d] is: %s\n",i,*arr);

     arr++;
    }

   return 0;

  }
4

2 に答える 2

5

配列のようなものarrはメモリ内の特定arrの場所にあるため、インクリメントしても意味がありません (配列をインクリメントするとはどういう意味ですか?)

代わりに、配列の先頭へのポインターを作成し、ポインターをインクリメントする必要があります。

char **ptr = arr;
for(i=0; i<4; i++) {
    printf("arr[%d] = %s\n", i, *ptr);
    ptr++;
}

arr(また、 4 つの要素を大きくする必要があることにも注意してください。つまりchar *arr[4]、4 つの文字列ポインタを配置する必要があります。)

于 2013-02-27T07:52:03.553 に答える
-1

double ポインターを配列と考える傾向がありますが、すべてのコンパイラーは double ポインターをポインターと見なすことに注意してください。ポインターをインクリメントすると、ポインターが指しているデータ型のサイズに等しい値がポインターのアドレスに追加されます。例えば:

int *p;
p = (int *) malloc(sizeof(int));

pは を指しているintため、 の指すデータのサイズpは (通常) 4 バイトです。これは、 をインクリメントするpと、以前よりも 4 バイト大きい位置を指していることを意味します。

の型arrは aです。char**これは、 へのポインターへのポインターであることを意味しますchar。最近のほとんどのマシンのポインターは 8 バイトです。したがって、 をインクリメントするときは、以前よりも 8 バイト高いアドレスを指すようarrに設定するようにコンピューターに効果的に指示していることになります。arrの場合arr、これは不正なアドレスであるため、何らかのクラッシュが発生します。

于 2013-02-27T08:24:17.933 に答える