0

私の投稿は 1 石で 2 羽の鳥を殺そうとしています。無知で申し訳ありません。

配列を進めるために使用できるindex[0]、または使用できる文字列の配列を作成しようとしています。ポインターの配列を作成する必要があるのか​​、配列へのポインターptr++を作成する必要があるのか​​ わかりません。変数は構造体に格納されます。無知を許してください。いつ、どこで を使用するかの優先順位に苦労しています。私は基本的な構造体を理解しています。構文構造が緩み始めたのは、文字列へのポインターを使い始めたときでした。この構文を理解できれば、配列の次元構造にさらに適用できます。charchar()

ptr++変数の割り当てが正しいと仮定すると、 のようなものに関してはむしろ使用すると思いますprintf("%s", ptr++)。私が正しく理解していればptr++、ポインターを次の文字列に移動するか、またはいくつかのptr++可能性があります。これは正しいですか?それは多くのことでより高速になるようです。

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

struct Umbrella {
  char  *name[10]; 
} Umbrella;

int main ()
{
  struct Umbrella * ptr;

 // Not understanding this way... 
  ptr->name[0] = "Some name";

 // or this way. Well name++ as long as it wasn't the first string.
  ptr->name++ = "Some name";
  return 0;
}

ブートノート: Prata の「C Primer Plus」を読みました。彼は物事をうまく説明しています。それは、構文を適用するのに失敗し始めたときに、物事を自分の意志に曲げ始めたときです。たとえば、構造体へのポインターを使用して多次元配列にアクセスすることはカバーされておらず、実際に使用する構文の方法でポインター演算をカバーしていませんでした。少なくともそのようなアプローチでろう付けするかもしれない別の本を誰か推薦できますか?

PS これは私の 2 回目の投稿です。言い忘れていましたが、このサイトのテキスト入力デザインがとても気に入っています。それを言わなければならなかった:-)。

4

1 に答える 1

1

まあ、char *name[10]実際には次のようなものがあります:

char *name0;
char *name1;
char *name2;
// .. etc

as としてアクセスすると、 asptr->name[0]が選択ptr->name0されchar*ます。

ptr->name++ = "asdf";ここではかなり悪い考えです。基本的には次のとおりです。

*(ptr->name) = "asdf";
ptr->name += 1;

もちろん、ここで name を 1 ずつ増やすことはできません (ポインタではなく配列です) ので、コンパイラはそれを許可しません。


この++演算子、過去のオブジェクトを反復するときに役立ちます。例 :

ptr->name[9] = nullptr; // Make sure the last element is a NULL pointer.

// Take the first element
char **it = ptr->name;

char *current;
// Loop until we reach the NULL
while ((current = *(it++)) != nullptr) {
    printf("%s\n", current);
}

上記は、配列を反復処理する (かなり醜い) 方法です。

事前に割り当てられた配列への挿入:

char **it = ptr->name; // Start at the first element

*(it++) = "Hi!";
*(it++) = "This is the second message.";
*(it++) = "Hello world!";
*(it++) = nullptr; // End the array

もちろん、この繰り返し作業はすべて暗い過去のものです。現在では、C++ がこれらのほとんどを処理してくれますstd::vector

于 2012-12-27T01:44:19.147 に答える