char*型とchar**型は異なる型でありchar*型のポインタ変数にchar**型のポインタ変数を逆にchar**型のポインタ変数にchar*型のポインタ変数を代入することはできません


ソーラー「


先程のプログラムでは


char*型のポインタ変数j


char**型のポインタ変数k


が生成されました

👇


#include <stdio.h>


int main() {


char i = 'c';


char* j = &i;


char** k = &j;


printf("%c\n", i);

printf("%p\n", j);

printf("%c\n", *j);

printf("%p\n", k);

printf("%p\n", *k);

printf("%c\n", **k);

return 0;


}


ビルド実行結果

c

006FFB3F

c

006FFB30

006FFB3F

c


アレサ「


char*型のポインタ変数j

char**型のポインタ変数k


ポインタ変数なら


j=k;


k=j;


のようなことは実行できるのでしょうか?」


ソーラー「そうだね!


char*型のポインタ変数jに


char**型のポインタ変数kを代入できるのか?


また 逆に


char**型のポインタ変数kに


char**型のポインタ変数jを代入できるのか?


試してみたいと思います


その時のプログラムはこちらです

👇

#include <stdio.h>


int main() {


char i = 'c';


char* j = &i;


char** k = &j;


printf("%c\n", i);

printf("%p\n", j);

printf("%c\n", *j);

printf("%p\n", k);

printf("%p\n", *k);

printf("%c\n", **k);


j=k;

printf("%p\n", j);

printf("%p\n", k);

k=j;

printf("%p\n", k);

printf("%p\n", j);

return 0;


}


ビルド実行結果


エラー (アクティブ) E0513 型 "char **" の値を型 "char *" のエンティティに割り当てることはできません

エラー (アクティブ) E0513 型 "char *" の値を型 "char **" のエンティティに割り当てることはできません

エラー C2440 '=': 'char **' から 'char *' に変換できません。

エラー C2440 '=': 'char *' から 'char **' に変換できません。


ソーラー「ビルドエラーが表示されましたね



このように


       char*型とchar**型は異なる型であり


char*型のポインタ変数にchar**型のポインタ変数を


代入したり


逆に


char**型のポインタ変数にchar*型のポインタ変数を


代入することはできません


つまり


int*型のポインタ変数

char*型のポインタ変数

異なる型のポインタ変数で


int*型のポインタ変数

char*型のポインタ変数


char*型のポインタ変数

int*型のポインタ変数


を代入することができないのと


同様に


 char*型のポインタ変数は


char型の変数のアドレスを格納するポインタ変数であり



 char**型のポインタ変数は


char型の変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数で


異なる型の変数であり


char*型のポインタ変数にchar**型のポインタ変数を


代入したり


逆に


char**型のポインタ変数にchar*型のポインタ変数を


代入することはできないというわけです」


ソーラー「


それなら


char** k ;


を実行した場合に生成される


変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数kに


char i;


によって生成される変数iのアドレスは


k=&i;


のように代入できるか?


どうかということですね」


アレサ「ううん・・・


できないのではないですか?


kは


変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数であり


変数のアドレスを格納するポインタ変数では


ないのではないですか?」


ソーラー「正解です!


次のプログラムをご覧ください

👇


#include <stdio.h>


int main() {


char i = 'c';


char* j = &i;


char** k = &i;//👈ここです


printf("%c\n", i);

printf("%p\n", j);

printf("%c\n", *j);

printf("%p\n", k);

printf("%p\n", *k);

printf("%c\n", **k);


return 0;


}


ビルド実行結果


エラー (アクティブ) E0144 型 "char *" の値を使用して型 "char **" のエンティティを初期化することはできません

エラー C2440 '初期化中': 'char *' から 'char **' に変換できません。


ソーラー「このように


kは


char型の変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数であり


格納することができるのは


char型の変数のアドレスを格納するポインタ変数のアドレス


となっています


このプログラムでは


char型の変数iのアドレスを格納するポインタ変数jのアドレス



&j


なので


k=&j;


なら実行することはできます」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る