[解決済み] ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生する
2022-03-03 06:43:25
質問
このコードを使うと、GCCは「互換性のないポインタ型からの初期化」という警告を出します(コードは問題なく動作し、配列のすべての要素を表示するという、想定されたことを行いますが)。
#include <stdio.h>
int main(void)
{
int arr[5] = {3, 0, 3, 4, 1};
int *p = &arr;
printf("%p\n%p\n\n", p);
for (int a = 0; a < 5; a++)
printf("%d ", *(p++));
printf("\n");
}
しかし、次のコードを使用しても警告は表示されません。
int main(void)
{
int arr[5] = {3, 0, 3, 4, 1};
int *q = arr;
printf("%p\n%p\n\n", q);
for (int a = 0; a < 5; a++)
printf("%d ", *(q++));
printf("\n");
}
この2つのスニペットの唯一の違いは、*p = &arr と *q = arr を代入していることです。
- 正確に言うと、& で何が変わるのでしょうか?
- また、なぜ両方のケースでコードが実行され、まったく同じ出力が得られるのでしょうか?
解決方法は?
-
&arr
を与える。 配列ポインタ という特殊なポインタ型int(*)[5]
で、配列全体を指し示す。 -
arr
のような式で書かれた場合int *q = arr;
は、最初の要素へのポインタに分解されます。と完全に等価です。int *q = &arr[0];
最初のケースでは
int(*)[5]
を
int*
. これらは互換性のないポインタ型であるため、コンパイラの診断メッセージが表示されます。
結局のところ、配列ポインタと最初の要素への int ポインタは同じ表現で、内部的には同じアドレスになる可能性が非常に高いのです。このため、最初の例は正しいC言語ではないにもかかわらず、quot;work"なのです。
関連
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み] テスト
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み] 配列からポインタへの減衰とは何ですか?