2012-02-19 18 views
1

void * xを持つが、char *にキャストしたいので、++演算子は次のバイトを指し、次の4バイトのブロックを指しません。算術演算用ポインタをキャストする -

私はしかし、:

(char *) x -= byte_length; 

をコンパイラが文句を言う:私は間違って下さいつもり

Error, lvalue required as left value of assignment. 

を?おかげさまで

x = (char*)x - byte_length; 

char*xをキャストし、オフセット、そしてxに戻って割り当てを適用します。私はこのようにそれを行うだろう

void* x; 
char* cx = (char*)x; 
cx -= byte_length; 
x = cx; 
+3

あなたは++演算子のような '' void *型を扱うと思いますなぜ'int *'? –

答えて

2

はこのような何かを行います。 void*はすべてのポインタ型と互換性があるので、それ以上のキャストは必要ありません。

+0

ありがとうございます。私はこれを解決策と考えていましたが、まだ1行の解決策があるかどうかはわかりませんでした。 – user973758

+0

私は「私は後で 'char *」として必要になるでしょう。その場合、 'cx'を使用して' char * 'で毎回キャストするほうがはるかに優れています。これが 'x'を' char * 'として実行している唯一の操作であれば、必ず1行でキャスティングするのが最適です。 –

5

5

(char *)xは、xと同じ値で一時的に評価されますが、異なるタイプです。コンパイラは-=を一時的に許可しません。

x = (char *)x - byte_length; 

を行い、状況は次のように似ています。

short x = 0; 
(long)x += 1;  // invalid; (long)x is a temporary 
x = (long)x + 1; // works 
+0

2番目の例では、キャストは常に役に立たないとは限りません。一部のシステムでは、 'x = x + 1'は' x =(long)x + 1'がないUBになります。たとえば、8ビットシステムでは、 'short'と' int'は通常16ビットと 'long' 32ビットです。 – ouah

+0

@ouah:なぜ 'x =(x + 1)'が定義されていないのですか? –

+0

@OliCharlesworth私の例では( 'short'と' int'16ビット)、 'x'は' SHRT_MAX'です。オーバーフローしていないので、署名されたオーバーフローのために 'x + 1'をUBにします。 )x + 1 'となる。 – ouah

0

(char*)xは、メモリ内のアドレスされていない一時的な値です。 int iがある場合、(i+5)++を実行できないのと同じ理由で、--を実行することはできません。

代わりにx=(char*)x-byte_length;を実行する必要があります。

(char*) xはタイプとしてchar*一時的な値を作成し、この文でもhttp://c-faq.com/ptrs/castincr.html

1
(char*) x -= byte_length; 

参照してください。変数に割り当てることができるのは、の参照(またはコンパイラに応じてlvalue)だけです。それへ参照char*にXのアドレスをキャストし、それを逆参照されて得るために

一つの方法:

*(char*) &x -= byte_length; 
+0

+1は 'lvalue'sと' rvalue'sのトピックを表示します。 –

+0

@Alex私は彼らが何を意味しているのか疑問に思っていましたが、通常はC++を使用していました(*参考*)が、これを書いたときにはC++はある種の自動ポインタ 'lvalues'として*参照* – RPFeltz

+0

基本オブジェクトが変更されない参照もありませんか? –

関連する問題