2024年12月19日木曜日

C言語② ポインタ ・関数 ・引数と戻り値・変数・仮引数

 ポインタ
オンライン開発環境【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);
}



















0 件のコメント:

コメントを投稿

M5Stack用MIDI音源ユニット(SAM2695) → XIAO MIDI シンセサイザー スケッチ例

 M5Stack用MIDI音源ユニット(SAM2695)にXIAO ESP32C3制御  XIAO MIDI シンセサイザーSeeed_Arduino_MIDI Master-mainライブラリーによるスケッチ例(StateMachine)の音を出してみました。   動画