web-dev-qa-db-ja.com

Cの文字列へのポインター?

char *ptrChar;

ptrCharcharへのポインタであることを知っています。 stringへのポインタのコマンドは何ですか?

編集:同じ場合(ptrからchar、ptrからstring)—以下の変数定義は何を表していますか?

char (*ptr)[N];

よくわかりません。

9
user1980750

同じ表記法が、単一文字またはヌル終了文字列の最初の文字を指すために使用されます。

_char c = 'Z';
char a[] = "Hello world";

char *ptr1 = &c;
char *ptr2 = a;      // Points to the 'H' of "Hello world"
char *ptr3 = &a[0];  // Also points to the 'H' of "Hello world"
char *ptr4 = &a[6];  // Points to the 'w' of "world"
char *ptr5 = a + 6;  // Also points to the 'w' of "world"
_

_ptr2_と_ptr3_の値は同じです。 _ptr4_および_ptr5_の値も同様です。一部のデータを文字列として扱う場合は、そのデータがヌルで終了していることと、使用するスペースがあることを確認することが重要です。多くの問題は、使用可能なスペースが分からず、文字列が適切にヌルで終了したかどうかがわからないことが原因です。

上記のすべてのポインタは、配列であるかのように逆参照できることに注意してください。

_ *ptr1    == 'Z'
  ptr1[0] == 'Z'

 *ptr2    == 'H'
  ptr2[0] == 'H'
  ptr2[4] == 'o'

 *ptr4    == 'w'
  ptr4[0] == 'w'
  ptr4[4] == 'd'

  ptr5[0] ==   ptr3[6]
*(ptr5+0) == *(ptr3+6)
_

質問への後半追加

char (*ptr)[N];は何を表していますか?

これは完全に複雑な獣です。 N文字の配列へのポインターです。タイプはまったく異なります。使用方法はまったく異なります。指すオブジェクトのサイズはまったく異なります。

_char (*ptr)[12] = &a;

(*ptr)[0] == 'H'
(*ptr)[6] == 'w'

*(*ptr + 6) == 'w'
_

_ptr + 1_は未定義の領域を指しますが、aの先頭を超えて「12バイトの1つの配列」を指します。わずかに異なるシナリオを考えると:

_char b[3][12] = { "Hello world", "Farewell", "Au revoir" };

char (*pb)[12] = &b[0];
_

今:

_(*(pb+0))[0] == 'H'
(*(pb+1))[0] == 'F'
(*(pb+2))[5] == 'v'
_

しばらくの間偶然の場合を除き、おそらく配列へのポインタに出くわすことはないでしょう。私は過去25年間にそれらを数回使用しましたが、片手での機会を数えることができるほど少数です(そしてそれらのいくつかはStack Overflowに関する質問に答えています)。それらが存在すること、配列のアドレスを取得した結果であり、おそらくそれを望まないことを知っているだけでなく、配列へのポインタについてさらに知る必要はありません。

21

まったく同じです。 C文字列は文字の配列にすぎないため、文字列へのポインターは文字の配列へのポインターです。そして、配列へのポインタは、その最初の要素へのポインタとまったく同じです。

9
Thomas

C文字列は文字の配列にすぎないため、文字列へのポインターは文字の配列へのポインターです。そして、配列へのポインタは、その最初の要素へのポインタとまったく同じです。文字列は、基本的に(char * ptrChar;)が指している場所から、ヌル文字(\ 0)までに区切られています。

1
Sachin Sridhar

文字列は、基本的に(char *ptrChar;)、ヌル文字(\0)。

char *ptrChar;は実際には文字列(char配列)の先頭を指しているので、それはその文字列へのポインタなので、ptrChar[x]たとえば、実際には、charの先頭からx回(ptrCharが指している場所から)メモリ位置に実際にアクセスします。

1
SmRndGuy