[解決済み] ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生する
2022-02-27 17:03:35
質問
このコードを使うと、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の入力の最後に期待される宣言またはステートメント
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] 配列からポインタへの減衰とは何ですか?