C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
2022-02-10 23:37:49
参考文献[1]参照 http://blog.chinaunix.net/uid-30254479-id-5066996.html
0. 質問
配列名を持つポインタの代入 警告:互換性のないポインタ型からの初期化
コード例は以下の通りです。
int a[5]={1,2,3,4,5};
int (*p)[5]= a;
コンパイル時の警告: 互換性のないポインタ型からの初期化。
以下のようにコードを修正すると、警告は消えます。
int a[5]={1,2,3,4,5};
int (*p)[5]= &a;
理由
とはいえ
a と &a は同じ値で,どちらも配列の先頭アドレスですが,型は同じではありません
:
アドレスとしてのaはint *型である。
&a のアドレスは int (*)[5] 型である。
で、pもint型(*)[5]である。
1. バリデーション
#include<stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int (*p)[5] = &a;
printf("a = %p\n", a);
printf("&a = %p\n", &a);
printf("p = %p\n", p);
printf("p+1 = %p\n", p + 1);
int b[] = {1,2,3,4,5};
int c[][3] = {
{1,2,3},{4,5,6}};
return 0;
}
出力してください。
a = 0xffffef350420
&a = 0xffffef350420
p = 0xffffef350420
p+1 = 0xffffef350434
int (*p)[5] = &a;
p は5個の要素を持つ1次元配列へのポインタ型です。
p++、またはp+1は、"5つの要素を含む1次元配列a"の後のアドレスを指すことになります。
int a[5] = {1,2,3,4,5} です。
int *p = a; // equivalent to int *p = a[0]; pはint型へのポインタ、p++は配列の次の要素である2のアドレスを指します。
int (*p)[5] = &a; // 1次元配列ポインタpは、1次元配列a全体を指す。 p++で、"5つの要素を含む1次元配列a"の後のアドレスを指すようになります。
つまり、2次元の配列を定義するということは、2次元目の長さを指定することです。
もし
int c[][] = {
{1,2,3},{4,5,6}};
というコンパイルエラーが発生します。
c_pointer_type.c: In function 'main':
c_pointer_type.c:14:6: error: array type has incomplete element type
int c[][] = {
{1,2,3},{4,5,6}};
^
関連
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
initializer element is not constant "というエラーが表示されるのですが?
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
関数 'malloc' の暗黙の宣言に対する解決策
-
未定義の `__isoc99_sscanf' への参照
-
C/C++の再定義