ポインタ
オンライン開発環境【paiza.io】にサンプルプログラムを入力・実行しながら確認しました。#include <stdio.h>
int main( ) {
int data;
int *po;
data = 3;
printf("data(データ) = %d\n", data);
printf("data(アドレス)= %08X\n", &data);
po = &data;
printf("po (アドレス) = %08X\n", po);
printf("po (データ) = %d\n", *po);
return 0;
}
変数 【int data;】[data]データ [&data]データのアドレス
ポインタ変数【int *po;】[*po]データ [po]データのアドレスポインタの式
ポインタ演算【整数以外はできない】【整数による加減算のみ】
ポインタ演算【整数以外はできない】【整数による加減算のみ】
#include <stdio.h>
int main()
{
int ary[2] = { 10 , 20 };
int *po0,*po1;
po0 = &ary[0];//(10)アドレス
printf("(10)アドレス\t = %x\n" , po0);
printf("(10)データ\t = %d\n" , *po0);
po1 = &ary[1];//(10)アドレス
printf("(20)アドレス\t = %x\n" , po1);
printf("(20)データ\t = %d\n" , *po1);
*po0=*po0+*po1;
printf("(10+20)アドレス= %x\n" , po0);
printf("(10+20)データ\t = %d\n" , *po0);
return 0;
}
#include <stdio.h>
int main()
{
int ary[2] = { 10 , 20 };
int *po0,*po1;
po0 = &ary[0];
printf("(10)アドレス\t = %x\n" , po0);
printf("(10)データ\t = %d\n" , *po0);
po1 = &ary[1];
printf("(20)アドレス\t = %x\n" , po1);
printf("(20)データ\t = %d\n" , *po1);
*po0=*po0+*po1;
printf("(10+20)アドレス= %x\n" , po0);
printf("(10+20)データ\t = %d\n" , *po0);
return 0;
}
ポインタアドレス
(10)[ef29628][ef29629][ef2962a][ef2962b]4バイト
( 20)[ef2962c][ef2962d][ef2962e][ef2962f]4バイト
配列とポインタ
#include <stdio.h>
int main() {
char str[] = "kitty on your lap";
printf("str[0]データ\t\t= %c\n" , *str);
printf("str[0]のアドレス\t= %x\n" , str);
printf("str[1]データ\t\t= %c\n" , *(str+1));
printf("str[1]のアドレス\t= %x\n" , str+1);
printf("str[16]データ\t\t= %c\n" , *(str+16));
printf("str[16]のアドレス\t= %x" , str+16);
return 0;
}
文字列ポインタ
#include <stdio.h>
int main() {
char *str = "abc def ghi jkl";
printf("先頭文字 = %c\n",*str);
printf("先頭文字HEX = %x\n",*str);
printf("アドレス = %x\n" , str);
printf("格納文字列 = %s\n" , str);
printf("2番目文字 = %c\n" , str[1]);
printf("2番目アドレス = %x\n" , &str[1]);
return 0;
}
#include <stdio.h>
int main() {
char *str = "abc \0 def \0 ghi";
printf("%s\n%s\n%s" , str , str + 6 , str + 12);
return 0;
}
ポインタ配列
#include <stdio.h>
int main() {
int get_n;
char *ary[] = { "abc" , "def" , "ghi" };
printf("%s\n" , ary[0]);
printf("%x\n" , ary[0]);
printf("%s\n" , ary[1]);
printf("%x\n" , ary[1]);
printf("%s\n" , ary[2]);
printf("%x\n" , ary[2]);
return 0;
}
関数
#include <stdio.h>
void funcA() {
printf("abc\n");
}
void funcB() {
printf("def\n");
}
void funcC();
int main() {
funcA();
funcB();
funcC();
return 0;
}
void funcC() {
printf("ghi\n");
}
引数と戻り値
#include <stdio.h>
void func1( char str[], int var);
int func2(int A , int B);
int main() {
func1("abc def ghi" , 8);
int C = func2( 2 , 3 );
printf("合計 = %d\n" , C);
return 0;
}
void func1( char str[], int var) {
printf("%s\n" , str + var);
}
int func2(int A , int B ) {
return A + B;
}
ローカル変数(関数内で宣言され関数内のみ有効)
#include<stdio.h>
void func(void);
int main() {
int var = 1;
printf("main()のvar = %d\n",var);
printf("main()のvar = %x\n",&var);
func();
printf("main()のvar = %d\n" , var);
printf("main()のvar = %x\n" , &var);
return 0;
}
void func() {
int var = 2;
printf("func()のvar = %d\n",var);
printf("func()のvar = %x\n",&var);
}
グローバル変数(関数の外で宣言され全関数で有効)
#include<stdio.h>
void func(void);
int var = 3;
int main() {
printf("main() varのアドレス = %x\n" , &var);
printf("main() varの値 = %d\n" , var);
func();
var = 5;
func();
return 0;
}
void func() {
printf("func() varのアドレス = %x\n" , &var);
printf("func() varの値 = %d\n" , var);
}
仮引数
#include<stdio.h>
void value(int );
void reference(int *);
int main() {
int var = 10;
printf("値渡し1 = %d\n" , var);
printf("値渡し1 = %x\n" , &var);
value(var);
printf("値渡し2 = %d\n" , var);
printf("値渡し2 = %x\n" , &var);
reference(&var);
printf("参照渡し3 = %d\n" , var);
printf("参照渡し3 = %x\n" , &var);
return 0;
}
void value(int var) {
var = 20;
printf("値渡し2' = %d\n" , var);
printf("値渡し2' = %x\n" , &var);
}
void reference(int *var) {
*var = 30;
printf("参照渡し3' = %d\n" , *var);
printf("参照渡し3' = %x\n" , &var);
}
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
0 件のコメント:
コメントを投稿