2011-09-09 39 views
1
int main() 
{ 
double x = 10.08; 
double *p; 
p = &x; 
printf("value of pointer is %d\n",p); 
*p=&x;//error line 
printf("value of x, *p = %lf\n",x); 
return 0; 
} 

私がint型(int x、int * p)の場合、それは正常に動作します。しかし、ダブルではない、なぜ?ポインタの互換性のない型エラー

+0

のvoidポインタのために行く代わりに、常に二重のポインタを使用してはいけません。つまり、 '* p =&x'では' p'を逆参照して 'x'へのポインタに代入しているので問題があります。私はこれが 'int'と' double'との関係がないと信じていません –

+1

そのコード行は何を期待していますか? (ヒント:おそらく間違っていると思います。ポインタの宣言とポインタの宣言と単項 '*'演算子の使用の違い) –

+0

* p = x;エラーラインに?あなたはpの指すアドレスにxの値を格納しようとしていますか? –

答えて

2

*pは、タイプがdoubleであり、 &xのタイプはdouble *です。それらは互換性がありません。ところで

、変換%p使用し、ポインタ値をプリントアウトする:

printf("value of pointer is %p\n", p); 
+0

void *へのキャスト:printf( "ポインタの値は%p \ n"、(void *)p); ' –

0

*pタイプの二重です。 &xは、ポインタを二重にする型です。なぜあなたはそれらが互換性があると思いますか?

intであっても、警告をオンにして警告を出すと、あなたのコンパイラはそのことについて不平を言うことを期待しています。

+0

int main() { int x = 10.08; int * p; p =&x; printf( "ポインタの値は%d \ n"、p)です。 * p =&x; printf( "xの値、* p =%d \ n"、x); return 0; } ちょうどそれを動作させ、その正常に動作します。 – Gopal

+1

**コンパイラの警告をオンにしてください**。 '%d'は 'int'型を予期していますが、引数2の型は 'int *'です。 tc:8:4:警告:代入する整数キャストのないポインタから ' – Mat

-1

これは* pをので、Cに従うべきではないですが、それはxの値を意味inturnsし、x値のアドレスを格納したいが、あなたはポインタとしてそれを宣言していない

*p = &x       with  *p = (unsigned int) &x \\ this works 
*p = &x it means x = &x ; Not a syntax to follow 

を交換したが通常の変数です。

ただしインクルードは、あなたが任意のエラーが、

non portable assigment 

は、私は深く根を知らないが、私の調査のためとして、私はポインタが他のいくつかの形式のアドレスが、ショーを救う推測することを示す警告を取得いけないint型で私たちの整数形式

int x; 
int *p; 
p = &x ; 
*p = &x ; warning non portable assignment replace with *p = (unsigned int) &x 

using typecasting (unsigned int) coverts the address format to integer format 
I guess So . May be the address format and integer format are different 
Thats why you cant assign address to a variable unless it is typecasted 
but pointers dont need them because as they are invented to store the address 
This is what i think from my investigation 

しかし、私は非常に上記の構文に従っていないお勧めします。

人々は、私は、全Cの初心者くさいよ

+0

なぜ私は-1 MR MRを取得しましたか? – niko

関連する問題