-1

qsort() を理解しようとしているので、ここでポインターがどのように機能するかを読んでいます。しかし、ガイドはこのコードを提供します:

// increaser
#include <iostream>
using namespace std;

void increase (void* data, int psize)
{
  if ( psize == sizeof(char) )
  { char* pchar; pchar=(char*)data; ++(*pchar); }
  else if (psize == sizeof(int) )
  { int* pint; pint=(int*)data; ++(*pint); }
}

int main ()
{
  char a = 'x';
  int b = 1602;
  increase (&a,sizeof(a));
  increase (&b,sizeof(b));
  cout << a << ", " << b << endl;
  return 0;
}

何の線か説明せずに

pint=(int*)data;

pchar=(char*)data;

意味。残りの意味は理解できますが、(char*)data が何を意味するのかは、私にはまったく理解できません。char の値を指していますか? しかし、char が変数型である場合はどうすればよいでしょうか?

4

7 に答える 7

8

ラインpint = (int*)dataは2つのことをしています

  1. はからへ(int*)dataの変換ですvoid*int*
  2. へのpint = ...値の割り当てです。pint

最終的に、この関数が行おうとしているのは、 が指す値dataを 1 つずつインクリメントすることです。ただし、a) 署名は任意のポインター型を受け入れますが、実装は固定された型のセットでのみ機能し、b) サイズを型に誤って関連付けるため、少し欠陥があります。

これが C++ であることを考えると、これを記述するより良い方法は、テンプレートを使用することです。をサポートするすべての入力タイプを受け入れます++

template <class T>
void increase(T* pValue) {
  ++(*pValue);
}

理想的には、参照を使用するだけですが

template <class T>
void increase(T& value) {
  ++value;
}
于 2013-04-02T20:51:15.657 に答える
2

データは void* として渡されます

(int*)data は int* にキャストしています。

于 2013-04-02T20:52:08.223 に答える
2
(int*)data;

(char*)data;

は、あるポインター型から別のポインター型へのキャストです。この場合はvoid* toint*およびからchar*です。その後、結果が割り当てられpintpchar

于 2013-04-02T20:50:51.757 に答える
1

pcharへのポインタですchar- これが宣言です

char* pchar;

意味。このように、配属後は

pchar=(char*)data;

ポインタpcharは - が指すブロックの先頭を指しており、数値 (たとえば 5 - ) でdataオフセットすると、 が指す位置から「5 文字」のメモリ位置を指します。aは 1 バイト長であるため、位置を 5 ずつ増やしていることを意味します。pchar*(pchar+5)datacharpintint* pint*(pint+5)5*sizeof(int)+5

つまり、宣言は、ポインターが指すオブジェクトをどのように処理するか、およびポインターをオフセットするときに何をすべきか (インクリメント、デクリメントなど) をコンパイラーに指示します。

于 2013-04-02T20:55:50.667 に答える
1
pint=(int*)data;

pchar=(char*)data;

doubleaaを anintに、またはその逆にキャストするのと同じように、これらの変数をポインターとしてキャストしています。

于 2013-04-02T20:50:49.610 に答える
0

ポインターはメモリ内の場所を指します (32 ビット システムでは、すべてのポインターの幅は 32 ビットであり、64 ビット システムでは 64 ビットです)。書き込むときvoid* pointerは、メモリ内のデータに型がないことをコンパイラに伝えているため、コンパイラは内容を読み取るためにデフォルトの幅 (例: 8 ビット) を使用します。ポインター自体は常に 32/64 ビットですが、ポインターが指すデータは異なることに注意してください。

たとえば、char* ポインターと言うと、データが文字であることを認識し、2 バイト (32 ビット) を読み取ります。int* なども同様です。または long* ポインターの場合、4 バイトを読み取ります。

あなたが書くとき、あなたpchar = (char*)dataはCPU(実際にはMMU)にpcharアドレスに格納されたデータがcharであることを伝えているので、それを読むと言ったとき、私のために2バイトを読んでください。(short*) と言ったとき、MMU にそのポインタに対して 1 バイトを読み取るように指示しています。

void* を使用すると、システムはデフォルトのサイズを使用しますが、これは 1 バイトだと思います。

于 2013-04-02T21:10:51.403 に答える
0

ポインターは、他の変数のように変数ではありません。正規の値を保持しません。それがすることは、そのアドレスを保持することによって、メモリ内のある場所を覚えているだけです。

メモリ内の任意の場所で、任意の型の任意の変数を開始できます。作成されたものとは別の型にポインターをキャストすることにより ((char*)たとえば)、プログラムに、指定された型の変数であるかのようにメモリ内のその場所を操作する必要があることを知らせます。

于 2013-04-02T21:00:52.130 に答える