• ベストアンサー

ポインタのキャスト

配列の先頭アドレスをunsigned long型で取得するにはどうしたら良いでしょうか? 下記だとダメですよね? char a{4} = [0, 1, 2, 3]; unsigned long adr; adr = (usigned long)&a[0]; よろしくお願いします。

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

  • ベストアンサー
回答No.2

unsigned longがpointerを表す型であるというシステムなら、 adr = (unsigned long)a; とすれば行けるはずです。もちろん、一般的には下記です。 char* adr; adr = a; &a[0]はおかしいです。aで配列の先頭アドレスを表します。 a[0]がchar型のデータ0を表しますから、このアドレスを取 り出すということはあり得ません。

catsuya
質問者

補足

回答ありがとうございます。 > unsigned longがpointerを表す型であるというシステムなら、 > adr = (unsigned long)a; > とすれば行けるはずです。 VisualStduio2008で実行してみましたが、aのアドレス情報取得できませんでした。。。 > &a[0]はおかしいです。aで配列の先頭アドレスを表します。 > a[0]がchar型のデータ0を表しますから、このアドレスを取 > り出すということはあり得ません。 おかしいでしょうか? a[0]のデータのアドレスを取得=配列の先頭アドレスの意味になりませんか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

>VisualStduio2008で実行してみましたが、aのアドレス情報取得できませんでした。。。 取得できないと言うのは、コンパイルがNGだったのか、コンパイル正常終了後の実行で参照不正等でプログラムが落ちてしまったのか? 色々あると思います。 &a[0]は確かにaの先頭アドレスを示します。 また、「アドレス情報」とおっしゃっている情報がどんな情報なのか申し訳ありませんが私には分かりませんでした。 私の情報不足?

catsuya
質問者

お礼

すいません、解決できました。 VCのデバッガだと10進で表示されていてたので、、、 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

そもそも、何故そんな事をやりたいのかが分かりません。 素直にchar型のポインタで受け取ればいいだけのような気がするのですが。。。 キャストやらずにプログラムが組めるのであれば、キャストしないのが一番です。 何故やりたいのか、考えを教えてください。

catsuya
質問者

補足

早速の回答ありがとうございます。 > キャストやらずにプログラムが組めるのであれば、キャストしないのが一番です。 おっしゃる通りです。 本来レジスタからunsigned long型でレジスタ情報を取得したいのですが、そのレジスタを化かすためにunsigned long型でアドレス情報が欲しいです

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポインタの演算について

    ポインタの演算に関して質問させて下さい。 unsigned long型のポインタに+1すると実際のアドレスは+4になってしまいます。 ex) unsigned long *a: 0xb7de1000 a+1 : 0xb7de1004 よって、アドレス+1(上では0xb7de1001)に値をかきこみたいのですが、 *(a+1)=ffffffffとすると 0xb7de1004に値が書きこまれてしまいます。 32bitの値を書きこみたいので現在は char *a: *(unsigned long*)(a+1)=ffffffff としているのですが、キャストを使わずに同様のことを実現することは可能でしょうか? ご教授よろしくお願いします。

  • ポインタ演算がうまくできません

    以下のソースを実行すると、直値でアドレスをしていするのは うまくアセンブラに展開され、意図するアドレスを取り出す ことが出来るのですが、変数でアドレス演算させると意図する アドレスが取得できません。  何か記述がおかしいのでしょうか? ご存知の方宜しくお願い致します。 char const test_tbl[] = { -3, -2, -1, 0, 1, 2, 3, 4, 5}; unsigned char *ptr; unsigned char work; #define STA_OFFSET (&test_tbl[3]) void main( void) { // 適切なポインタが取得できる ptr = (STA_OFFSET + 3); // ポインタが取得できない。 work = 3 ptr = (STA_OFFSET + work); }

  • 2次元配列とポインタの引数受け渡しについて

    2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。 最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。 そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。 #include <stdio.h> void func(unsigned char *a, int y, int x); int main(void) { unsigned char a[10][10]; func(a, 10, 10); printf("%d\n", a[7][4]); return 0; } void func(unsigned char *a, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { *(a + i*y + j) = i * j; } } } もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。 a.c: In function ‘main’: a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’ このような書き方はやはりやめたいいのでしょうか。 また、その際はサイズ別に関数を作るしかないのでしょうか。 他にいい方法があれば教えていただけると助かります。

  • ポインタの配列について

    はじめまして。 基本的な質問で恐縮ですが、質問があります。 例えば、char *name[] = {"Alice","Ben","Chris","Diana","Elmo"} のようなポインタの配列を宣言・初期化したとき、配列nameの各要素の 中身には、初期化子として与えた、文字列の先頭アドレスが 格納されているという解釈でよろしいのでしょうか?つまり、 *(name+1)やname[1]は、「文字列Benの先頭アドレスを指す」という意 味でよろしいのでしょうか?また、このとき、(name+1)というように *をつけないときは、「文字列Benの先頭アドレスを格納したメモリの 先頭アドレス」というような解釈でよろしいのでしょうか? どうかご教授お願いします。

  • 「動的確保した2次元配列のメモリ解放」を関数化したい

    質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

  • ポインタ

    long ToLittleEndian(char *a,long bytesize){ long i; char lb; char hb; long lsize; lsize=bytesize/2; for (i=0;i<lsize;i++){ hb=*(a++); lb=*(a--); *(a++)=lb; *(a++)=hb; } return 0; } ポインタのアドレスがはみだすとどうなるのでしょうか? 上記のようなコードの場合、最後の処理でポインタaが1バイト分はみ出してしまいますが、 存在しないアドレスを参照しようとするとエラーになるかと思いますが ポインタを動かすだけだと問題ないのでしょうか? 処理系やコンパイラに依るのでしょうか。 初心者ですがよろしくお願いします。

  • アドレス指定方法

    お世話になります アドレス指定について教えてください 例えば、構造体の配列があります 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項について、詳しく御教授して下さい よろしくお願い致します

  • 構造体とポインタ配列

    現在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]; 皆さん、どうかよろしくお願いいたします。 理解不能な場合はご指摘ください。

  • 2次元配列とポインタ

    char str1[][6]={"one","two","three","four","five"}; char *pt1; pt1 = str1; //(1) 上記の記述では(1)で型エラーが発生します。 ここを pt1 = *str1; //(2) と変更するとOKになるのですが、 (1)にすれば配列名だけでstr1先頭のアドレスがポインタpt1にセット されると思うのですが、なぜダメなのでしょうか?

  • C言語の配列の要素番号を得る

    例えば、 union ary_tag{ unsigned char byte[23]; struct { unsigned char aa; unsigned char bb; unsigned char cc; unsigned char dd; unsigned char ee; 途中省略 unsigned char xx; unsigned char yy; unsigned char zz; }a_z; } union ary_tag ary; とした場合、ary.a_z.xxは、配列で言うと何番目になるかを取得したいです。 number = &ary.a_z.xx - &ary.a_z.aa として算出しました。 他にやり方はあるのでしょうか?