アドレス指定方法とは?質問の回答

このQ&Aのポイント
  • アドレス指定方法についての質問があります。構造体の配列において、配列の先頭アドレスを指定する方法について詳しく教えてください。
  • 質問者はtTest[10]の先頭アドレスを指定する方法について疑問を持っています。コンパイルしてみた結果、1〜3の方法で同じ結果が得られたとのことですが、詳細な解説をお願いします。
  • アドレス指定方法に関する質問です。構造体の配列において、tTest、&tTest[0]、&tTestのいずれを使って先頭アドレスを指定するのが正しいのか教えてください。
回答を見る
  • ベストアンサー

アドレス指定方法

お世話になります アドレス指定について教えてください 例えば、構造体の配列があります typedef struct {   unsigned char m_bDat;   unsigned char m_bTemp; }tTEST; tTEST tTest[ 10 ]; // tTESTの配列を作成 この、"tTest[ 10 ]"の先頭アドレスを指す際の方法について 1.tTest 2.&tTest[ 0 ] 3.&tTest コンパイルしてみると、どれも同じ結果となったので、間違っていないと思うのですが・・・ 1~3項について、詳しく御教授して下さい よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

示される値は同じですが、これらは全て型が違います。 tTEST tTest[ 10 ]; の場合以下のようになります。 1.tTest tTEST[10]配列型の先頭アドレス #Cでは暗黙の変換としてtTEST型のポインタとして扱える 2.&tTest[ 0 ] tTESTポインタ型のtTest[10]の要素0ののアドレス 3.&tTest tTEST[10]配列ポインタ型のアドレス となります。

その他の回答 (1)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

日本語だと判りにくそうなので、 型を書いておきます。 1.tTest tTEST[10]配列型 これはそのまま。 tTEST[10] 2.&tTest[ 0 ] tTESTポインタ型 これもほぼそのまま。 tTEST* 3.&tTest tTEST[10]配列ポインタ型 少しややこしい。 tTEST(*)[10] です。

関連するQ&A

  • 1バイトデータの読み出しについて

    こんばんは。 すみません。文字操作?ポインタ操作が苦手なので教えてください。 以下のような構造体があり、その構造体から1バイトずつ読み出して 自作の関数のパラメータ(1バイト指定領域)に渡したいのですが、 構造体から1バイトずつデータを読み出すには、どのようにすればいいのでしょうか? typedef struct { PACKET_HEADER head; unsigned char Sp_Pr_St[1]; unsigned char ctrl_flow[1]; unsigned char product_org[10]; unsigned char product_name[10]; unsigned char product_ver[3]; }PRODUCT_RESPONS; typedef struct { unsigned char head; unsigned char type; unsigned char data_len; } HEADER; どうぞよろしくお願いします。

  • 構造体の宣言について

    今解析しているC言語のプログラムで以下の様な構造体の宣言があります。 typedef struct { unsigned char :3; unsigned char aaa :1; unsigned char bbb :1; unsigned char ccc :1; unsigned char ddd :1; unsigned char eee :1; } tTSR ; :3や:1の部分の意味がわかりません。 御存知の方ご回答よろしくお願いします。

  • 構造体とポインタ配列

    現在C言語の勉強をしております。 環境はwindowsXP、コンパイラはVC6.0です。 構造体と、ポインタの配列についてなのですが、 以下のような構造体が宣言されている時に、リスト構造にデータがいくつか入っているとします。 // 構造体 typedef struct address { unsigned char names[NAME_SIZE+1]; /* 名前 */ char tels[TEL_SIZE + 1]; /* 電話番号 */ struct address *prev; /* 前へのポインタ */ struct address *next; /* 次へのポインタ */ }Address, *a_pt; そのリスト構造を先頭要素か順番にポインタ配列に格納するには以下の方法ではおかしいでしょうか? /* ポインタ配列を用意する */ Address *array[MAX_COUNT]; /* top_ptは先頭のポインタです */ pt = top_pt; /* データがなくなるまで配列へ格納する */ while(pt != NULL){ array[count++] = pt; pt = pt->next; } /* 配列の最後はNULLとする */ array[count] = NULL; また、配列の中身を確認する方法としては、 printf("配列の中身:%s\n", array[0]->names); では、アドレスが表示されてしまうのかな・・と思ったら、accessViolationで落ちてしまいました・・・。 中身はどうしたらデバッグ出来ますでしょうか? そもそも、以下の2つは何か違いはありますか? Address *ptA[100]; a_pt ptB[100]; 皆さん、どうかよろしくお願いいたします。 理解不能な場合はご指摘ください。

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • 構造体 アドレス

    VC++6 こんにちは。構造体のアドレスを文字列ポインタで操作することに悩んでいます。下にソースの一部を書きます。 typedef struct{   char code[100];   int type; }AAA; typedef struct{   double method[4][3];   int area; }BBB; 複数の構造体があり、 BOOL CTestApp::File_Check(){  AAA aaa; ~  db.DB_regi(2, (char *)&aaa); ~ } void CData::DB_regi(int key, char *buff) {  switch(key){ ~  case 2:   sss.push_back(buff);  //vector<char *> sss;   break; } で、データを登録し、 int CTestApp::Data_Check() { ~  AAA aaa;  db.DB_get(2, (char *)&aaa); ~ } void CData::DB_get(int key, char *buff) {  switch(key){ ~  case 2:   buff = sss[i];   break; ~ } で、構造体のアドレスを取得しようと思ったら、取得できませんでした。 //DB_getの中では、aaa = (AAA *)buff;とすれば指定の構造体を取得できる。 DB_get関数をどのようにしたら、Data_Check()で、登録した構造体を取得できるのか教えてください。長くなってすみません。

  • 値を返さないといけないのに、返さない関数の挙動

    こんな感じの構造体・関数を作ったとします。 typedef struct personal_info {    char name[10];    char address[20]; } personal_t; personal_t getPersonal(int id){;} これには2つのギモンがありまして 1.getPersonalの中は何もせず、値を返さないのに なぜか、コンパイルは通る 2.実行すると、正常に動く いったい、どういう事なのでしょうか。 不思議でたまりません。 どうぞよろしくお願いします。

  • C++/CLIの構造体のコンストラクタについて

    C++/CLIの構造体のコンストラクタについて C++/CLIで、固定サイズの配列を持つ構造体を、次のようにコーディングして使っています。 value struct AAA { public:   array<unsigned short>^ m1;   AAA(unsigned short dummy)   {     m1 = gcnew array<unsigned short>(4);   } }; AAA ^struct0 = gcnew AAA(0); この方法で正常に動作するのですが、2点ほど気になる点があります。 (1) コンストラクタAAA(unsigned short dummy)を実装しなくても済む方法がないか? (2) この方法では、struct0を、ネイティブヒープ領域に割り当てられない (AAA *struct0 = new AAA(0))でコンパイルエラー) (1)と(2)は関連する気もするのですが、これらを解決する方法はあるのでしょうか?

  • ソケット通信の送受信方法

    ソケット通信を用いて、簡単な通信ゲームを作成しようと思っています。 メッセージ送信時に構造体を送りたいと思っているのですが どう指定してもエラーになってしまい、作業が止まってしまっています。 下記の様な指定の仕方ですと、エラーは起きないのですが・・・ char buf[256] = { 0 }; send(clsock,buf,256,0); typedef struct{ int a; int b; }sample; 上記のような構造体を送信、受信する場合は、どのように指定すれば良いのでしょうか? 知っている方いましたらご教授お願いします。

  • ファイルから構造体へデータを格納(動的メモリ割り当て)

    C言語の勉強をしいております。 typedef struct address { char names[32]; /* 名前 */ char tels[32]; /* 電話番号 */ struct address *prev; /* 前のリスト */ struct address *next; /* 次のリスト */ }Address; という構造体へ、ファイルから読み込んだテキストデータ(名前と電話番号がTABで区切られている)を格納したいのですが、配列ではなく、動的にメモリを確保しながら格納する方法を教えていただけないでしょうか? 処理の流れとしては、 ・1つめの構造体の*prevにはnullを入れておく。 ・1つめの構造体へファイルの1件目のデータを格納する。 ・ファイルのデータがまだある場合には、malloc関数を使ってメモリを確保し、malloc関数からの戻り値を1つめの構造体の*nextへ格納する。 ・構造体へ2件目のデータを格納する。 このような感じだろうという程度しか分からず、ソースも書けずにいます・・・。 配列を使用したサンプルはあるんですが、動的に処理を行う方法を教えていただけないでしょうか? よろしくお願いいたします。

専門家に質問してみよう