ポインタを傷つけない(3)--ポインタと構造タイプの関係
2513 ワード
構造タイプオブジェクトへのポインタを宣言できます.
すみません、ポインタptrでssの3つのメンバー変数にアクセスするにはどうすればいいですか?答え:ptr->a;//演算子を指すか、これら(*ptr)を指すことができる.a,前者を推奨する.ここに注意(*ptr)はssptr->bです.ptr->c;また、ポインタpstrでssの3つのメンバー変数にアクセスするにはどうすればいいですか?答え:*pstr;//ssのメンバーaにアクセスしました.*(pstr+1);//ssのメンバーbにアクセスしました.*(pstr+2)/ssのメンバーcにアクセスしました.MSVC++6.0で上記のコードを調整したことがありますが、pstrを使用して構造メンバーにアクセスするのは正規ではありません.なぜ正規ではないのかを説明するために、ポインタで配列の各ユニットにアクセスする方法を見てみましょう.(構造体を配列に変更)例13:
ポインタpaで配列arrayの3つのユニットにアクセスする方法は、*pa;//0番ユニット*(pa+1);//にアクセスしました第1号ユニット*(pa+2);//にアクセスしました2番目のセルにアクセスしたフォーマットは,ポインタを介して構造メンバーにアクセスする非正規メソッドのフォーマットと同様である.すべてのC/C++コンパイラは,配列のセルを配列する際に,常に各配列のセルを連続した記憶領域に格納し,セルとセルの間に隙間がない.ただし、構造オブジェクトの個々のメンバーを格納する場合、あるコンパイル環境では、ワード整列またはダブルワード整列、または他の何らかの整列が必要になる場合があります.隣接する2つのメンバーの間にいくつかの「パディングバイト」を追加する必要があります.これにより、各メンバーの間にいくつかのバイトの空きがある可能性があります.したがって、上記の例では、*pstrが構造オブジェクトssの最初のメンバー変数aにアクセスしても、*(pstr+1)が構造メンバーbに必ずアクセスできることは保証されない.メンバーaとメンバーbの間にはいくつかのパディングバイトがあるかもしれないので、不定*(pstr+1)はちょうどこれらのパディングバイトにアクセスしていますね.これもポインタの柔軟性を証明した.各構造のメンバーの間にバイトが埋め込まれているかどうかを見るのが目的なら、まあ、これはいい方法です.しかし、ポインタが構造メンバーにアクセスする正しい方法は、例12でポインタptrを使用する方法であるべきである.
struct MyStruct
{
int a;
int b;
int c;
};
struct MyStruct ss = {20,30,40};// ss, ss 20,30 40。
struct MyStruct *ptr = &ss;// ss 。 MyStruct *, MyStruct。
int *pstr = (int*)&ss;// ss 。 pstr ptr 。
すみません、ポインタptrでssの3つのメンバー変数にアクセスするにはどうすればいいですか?答え:ptr->a;//演算子を指すか、これら(*ptr)を指すことができる.a,前者を推奨する.ここに注意(*ptr)はssptr->bです.ptr->c;また、ポインタpstrでssの3つのメンバー変数にアクセスするにはどうすればいいですか?答え:*pstr;//ssのメンバーaにアクセスしました.*(pstr+1);//ssのメンバーbにアクセスしました.*(pstr+2)/ssのメンバーcにアクセスしました.MSVC++6.0で上記のコードを調整したことがありますが、pstrを使用して構造メンバーにアクセスするのは正規ではありません.なぜ正規ではないのかを説明するために、ポインタで配列の各ユニットにアクセスする方法を見てみましょう.(構造体を配列に変更)例13:
int array[3] = {35,56,37};
int *pa = array;
ポインタpaで配列arrayの3つのユニットにアクセスする方法は、*pa;//0番ユニット*(pa+1);//にアクセスしました第1号ユニット*(pa+2);//にアクセスしました2番目のセルにアクセスしたフォーマットは,ポインタを介して構造メンバーにアクセスする非正規メソッドのフォーマットと同様である.すべてのC/C++コンパイラは,配列のセルを配列する際に,常に各配列のセルを連続した記憶領域に格納し,セルとセルの間に隙間がない.ただし、構造オブジェクトの個々のメンバーを格納する場合、あるコンパイル環境では、ワード整列またはダブルワード整列、または他の何らかの整列が必要になる場合があります.隣接する2つのメンバーの間にいくつかの「パディングバイト」を追加する必要があります.これにより、各メンバーの間にいくつかのバイトの空きがある可能性があります.したがって、上記の例では、*pstrが構造オブジェクトssの最初のメンバー変数aにアクセスしても、*(pstr+1)が構造メンバーbに必ずアクセスできることは保証されない.メンバーaとメンバーbの間にはいくつかのパディングバイトがあるかもしれないので、不定*(pstr+1)はちょうどこれらのパディングバイトにアクセスしていますね.これもポインタの柔軟性を証明した.各構造のメンバーの間にバイトが埋め込まれているかどうかを見るのが目的なら、まあ、これはいい方法です.しかし、ポインタが構造メンバーにアクセスする正しい方法は、例12でポインタptrを使用する方法であるべきである.