• ベストアンサー

ポインタの演算について

SAYKAの回答

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

???? そんな事できないでしょ 0xb7de1000 : ff 0xb7de1001 : ff 0xb7de1002 : ff 0xb7de1003 : ff っていう格納の仕方だもん。(実際はちょっと違うんだけど概念だけね) それで「0xb7de1001」「に」「32bitで」値を入れるなんてしたら 0xb7de1001 : ff 0xb7de1002 : ff 0xb7de1003 : ff 0xb7de1004 : ff っていう事になるよ。(これがやりたいのかもしれないけど) そうすると本来0xb7de1004はa[1]の開始地点なんだけど値が壊れる事になる。 なのでこれは危ないし手法としては行儀が悪い事このうえないね。 因みに 0xb7de1000 : ffffffff 0xb7de1001 : ffffffff 0xb7de1002 : ffffffff 0xb7de1003 : ffffffff って格納されていると思っているならそれは誤り。1byteずつしか格納されてない。

runjump
質問者

補足

回答有難うございます。 実は外部デバイスのアドレスをmmapでPC上のアドレスに割り当てて書いています。 たしかに勘違いしていました。 アドレスは1バイトずつわりあてられているということですね。

関連するQ&A

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

    以下のソースを実行すると、直値でアドレスをしていするのは うまくアセンブラに展開され、意図するアドレスを取り出す ことが出来るのですが、変数でアドレス演算させると意図する アドレスが取得できません。  何か記述がおかしいのでしょうか? ご存知の方宜しくお願い致します。 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); }

  • ポインタ代入のoperator演算子のオーバロードの仕方

    下記、unsigned char*型を自前のクラスで作成した場合 どの様なoperator演算子が必要になりますでしょうか。 目的は、下記compにアクセスした回数をカウントさせたい為です。オーバロード関数の内部にカウンタを持たせたい。 unsigned char* と互換性を持たせるため、クラスはポインタとして定義して使用したいと思っています。 unsigned char comp[1000] ; int main( int, char** ){ unsigned char *v_ptr ; v_ptr = &comp[0] ; <- ここ *v_ptr = (unsigned char)100 ; <- ここ *v_ptr++ = *sw_ptr++ ; <- ここ return 0; } 下記のように使いたい unsigned char comp[1000] ; int main( int, char** ){ count * v_ptr ; v_ptr = &comp[0] ; <- ここ *v_ptr = (unsigned char)100 ; <- ここ *v_ptr++ = *sw_ptr++ ; <- ここ return 0; } class count{ public: unsigned char* operator*() { return ptr ; }  v_ptr& operator=()?? private: unsigned char* ptr ; } ; 色々調べてみましたが、自前クラスが右辺にある時のポインタ、アドレスオーバロードはありましたが、左辺のポインタ代入、値代入を見つける事が出来ませんでした。

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • ポインタのキャスト

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

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

  • ポインタ

    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バイト分はみ出してしまいますが、 存在しないアドレスを参照しようとするとエラーになるかと思いますが ポインタを動かすだけだと問題ないのでしょうか? 処理系やコンパイラに依るのでしょうか。 初心者ですがよろしくお願いします。

  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • 値のコピーについて

    お世話様です。 unsigned long aaa(32bit)にunsigned char bbb[4](8bit*4)を コピーする場合に、(1)と(2)で結果が違うのはなぜでしょうか? よろしくご教授お願いいたします。 (1)memcpy(&aaa bbb, 4); (2) { aaa = 0; unsigned long ccc = 0; ccc = static_cast<unsigned long>bbb[0]; aaa |= ((ccc << 24) & 0xFF000000); ccc = static_cast<unsigned long>bbb[1]; aaa |= ((ccc << 16) & 0x00FF0000); ccc = static_cast<unsigned long>bbb[2]; aaa |= ((ccc << 8) & 0x0000FF00); ccc = static_cast<unsigned long>bbb[3]; aaa |= ((ccc << 0) & 0x000000FF); } 【環境】CPU:Pentimum4 OS:WindowsXP コンパイラ:VC++8.0

  • void型へのポインタ

    というのがC言語にありますよね? このvoid型へのポインタというのは、 どのようにイメージすればいいのでしょうか? 例えばchar型へのポインタなら、 指している領域は 1バイトの領域ですよね? ではvoid型は? また malloc関数を 使って char *p; p=(char *)malloc(1000); とするとでchar型にキャストしているから、 1個1バイト分の領域が1000個用意して、 先頭アドレスをpに格納するのですよね? では、 int *q; q=(int *)malloc(1000); としたら、用意されるのは、int型にキャストしているから 1個2バイト分の領域が500個用意されるのでしょうか? お願いします。

  • c言語 等価演算子(==)について

    等価演算子(==)は、ポインタの指すオブジェクトが同一あるかないの判定する演算子。  故に下記の例、*sc1 == sc2 は、sc1とsc2の値(オブジェクト)を比較しているのですか教えてください。      char *sc1 = s1; char *sc2 = s2; *++sc1 == sc2;