ポインタを使用したソースを用意しました。現在60例あります。
ポインタの理解を深める、試験勉強に使う、などなど、自由に使ってください。
※特に解説はありません。
(環境によってはコンパイル時に警告が表示されるかもしれません。)
#include <stdio.h> #include <stdlib.h> #include <string.h> /* あまり使っていない定義 */ typedef char* pchar; /* 基本的なポインタの使い方。 */ void func1(){ int a; int *p; printf("Function : %s\n",__func__); a = 1; p = &a; printf("a: %d, *p: %d\n", a, *p); } /* func1と似ているが、代入する位置が異なる。 */ void func2(){ int a; int *p; printf("Function : %s\n",__func__); p = &a; a = 1; printf("a: %d, *p: %d\n", a, *p); } /* ポインタの方に代入する例。 */ void func3(){ int a; int *p; printf("Function : %s\n",__func__); p = &a; *p = 2; printf("a: %d, *p: %d\n", a, *p); } /* 配列とアドレス。 */ void func4(){ int a[10]; int *p; printf("Function : %s\n",__func__); p = &a[0]; printf("addr: %ld %ld %ld %ld....\n", (long)p, (long)(p + 1), (long)(p + 2), (long)(p + 3)); } /* 配列とポインタ。 */ void func5(){ int a[10]; int *p; printf("Function : %s\n",__func__); p = &a[0]; *p = 1; *(p + 1) = 2; printf("a[0]: %d, a[1]: %d, *p: %d *(p + 1): %d\n", a[0], a[1], *p, *(p + 1)); } /* ポインタをインクリメントしたときのアドレスの変化。 */ void func6(){ int a[10]; int *p; printf("Function : %s\n",__func__); p = &a[0]; printf("p(addr): %ld\n", (long)p); p++; printf("p(addr): %ld\n", (long)p); } /* func6と似ているが、型が異なる。 */ void func7(){ double a[10]; double *p; printf("Function : %s\n",__func__); p = &a[0]; printf("p(addr): %ld\n", (long)p); p++; printf("p(addr): %ld\n", (long)p); } /* 配列とポインタ。ポインタのインクリメント。 */ void func8(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; printf("Function : %s\n",__func__); p = &a[0]; printf("a[0]: %d, *p: %d\n", a[0], *p); p++; printf("a[1]: %d, *p: %d\n", a[1], *p); } /* 配列とポインタ。 */ void func9(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; printf("Function : %s\n",__func__); p = &a[0]; printf("a[0]: %d, *p: %d\n", a[0], *p); p+=2; printf("a[2]: %d, *p: %d\n", a[2], *p); *p = 100; printf("a[2]: %d, *p: %d\n", a[2], *p); } /* 配列とポインタ。 */ void func10(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; printf("Function : %s\n",__func__); p = &a[0]; printf("a[0]: %d, *p: %d\n", a[0], *p); *p = *(p + 1) * (*(p + 2)); printf("a[0]: %d, *p: %d\n", a[0], *p); } /* 配列とポインタ。 */ void func11(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; printf("Function : %s\n",__func__); p = &a[0]; printf("a[0]: %d, *p: %d\n", a[0], *p); (*p)++; printf("a[0]: %d, *p: %d\n", a[0], *p); } /* 配列とポインタ。ポインタのデクリメント。 */ void func12(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; printf("Function : %s\n",__func__); p = &a[5]; printf("a[5]: %d, *p: %d\n", a[0], *p); p--; printf("a[4]: %d, *p: %d\n", a[0], *p); } /* 配列とポインタ。ポインタを2つ使用。 */ void func13(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; int *p2; printf("Function : %s\n",__func__); p = &a[0]; p2 = p; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); } /* 配列とポインタ。ポインタを2つ使用。 */ void func14(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; int *p2; printf("Function : %s\n",__func__); p = &a[0]; p2 = p; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); *p = 5; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); *p2 = 15; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); } /* 配列とポインタ。ポインタを2つ使用。 */ void func15(){ int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; int *p2; printf("Function : %s\n",__func__); p = &a[5]; p2 = p; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); p++; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); p2--; printf("a[0]: %d, *p: %d *p2: %d\n", a[0], *p, *p2); } /* 文字列とポインタ。 */ void func16(){ char a[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = &a[0]; printf("a[0]: %c, *p: %c\n", a[0], *p); } /* 文字列とポインタ。 */ void func17(){ char a[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = &a[0]; printf("a: %s, p: %s\n", a, p); } /* 文字列とポインタ。 */ void func18(){ char a[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = a; printf("a: %s, p: %s\n", a, p); } /* 文字列とポインタ。 */ void func19(){ char a[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = &a[2]; printf("a: %s, p: %s\n", a, p); } /* 文字列とポインタ。 */ void func20(){ char a[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = a; printf("a: %s, p: %s\n", a, p); p++; printf("a: %s, p: %s\n", a, p); } /* 文字列とポインタ。サイズ。 */ void func21(){ char a[] = "ABCDEFGHIGKLMN"; char *p; printf("Function : %s\n",__func__); p = a; printf("sizeof(a): %ld, strlen(a): %ld\n", sizeof(a), strlen(a)); printf("sizeof(p): %ld, strlen(p): %ld\n", sizeof(p), strlen(p)); } /* 文字列とポインタ。1文字変える。 */ void func22(){ char a[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = a; printf("a: %s, p: %s\n", a, p); p++; *p = 'X'; printf("a: %s, p: %s\n", a, p); } /* mallocの使用。 */ void func23(){ const char src[] = "ABCDFGHIJ"; char *p; printf("Function : %s\n",__func__); p = (char*)malloc(100); strncpy(p, src, sizeof(src)); printf("p: %s\n", p); free(p); } /* callocの使用。 */ void func24(){ const char src[] = "ABCDFGHIJ"; char *p; printf("Function : %s\n",__func__); p = (char*)calloc(1, 100); strncpy(p, src, sizeof(src)); printf("p: %s\n", p); free(p); } /* reallocの使用。 */ void func25(){ const char src[] = "ABCDFGHIJ"; char *p; printf("Function : %s\n",__func__); p = (char*)calloc(1, 100); strncpy(p, src, sizeof(src)); printf("p: %s\n", p); p = (char*)realloc(p, 200); printf("p: %s\n", p); free(p); } /* reallocの使用。 */ void func26(){ const char src[] = "ABCDFGHIJ"; char *p; printf("Function : %s\n",__func__); p = (char*)calloc(1, 100); strncpy(p, src, sizeof(src)); printf("p: %s\n", p); p = (char*)realloc(p, 50); printf("p: %s\n", p); free(p); } /* 定義された文字列。 */ void func27(){ #define XXX "ABCDFGHIJ"; char *p; printf("Function : %s\n",__func__); p = XXX; printf("p: %s\n", p); #undef XXX } /* 文字列とポインタ。 */ void func28(){ char src[] = "ABCDFGHIJ"; char *p; char *p2; printf("Function : %s\n",__func__); p = src; p2 = p; printf("p: %s , p2: %s\n", p, p2); } /* 文字列とポインタ。 */ void func29(){ char src[] = "ABCDFGHIJ"; char *p; char *p2; printf("Function : %s\n",__func__); p = &src[1]; p2 = p; printf("p: %s , p2: %s\n", p, p2); p++; p2--; printf("p: %s , p2: %s\n", p, p2); } /* 引数がポインタ。 */ void func30_sub(int *p){ (*p)++; } void func30(){ int a; printf("Function : %s\n",__func__); a = 1; func30_sub(&a); printf("a: %d\n", a); } /* 引数がポインタ。 */ void func31_sub(int *p){ (*p)++; } void func31(){ int a; int *p; printf("Function : %s\n",__func__); p = &a; *p = 1; func31_sub(p); printf("a: %d, *p: %d\n", a, *p); } /* 引数がポインタ。 */ void func32_sub(int *p){ (*p)++; } void func32(){ int *p; printf("Function : %s\n",__func__); p = (int*)malloc(sizeof(int)); *p = 1; func32_sub(p); printf("*p: %d\n", *p); free(p); } /* 引数がポインタ。 */ void func33_sub(int *p){ p++; } void func33(){ int *p; printf("Function : %s\n",__func__); p = (int*)calloc(sizeof(int), 10); *p = 1; *(p + 1) = 2; func33_sub(p); printf("*p: %d\n", *p); free(p); } /* ポインタを返す関数。 */ char* func34_sub(char *p){ return (p + 1); } void func34(){ char c[] = "ABCDEFG"; char *p; printf("Function : %s\n",__func__); p = c; printf("%s\n", func34_sub(p)); } /* ポインタのポインタ。 */ void func35(){ int a[] = {1,2,3,4,5,6,7,8,9,10}; int *p; int **pp; printf("Function : %s\n",__func__); p = a; pp = &p; printf("%d\n", **pp); } /* ポインタのポインタ。 */ void func36(){ int a[] = {1,3,5,7,9}; int *p; int **pp; printf("Function : %s\n",__func__); p = a; pp = &p; printf("*p: %d, **pp: %d\n", *p, **pp); p++; printf("*p: %d, **pp: %d\n", *p, **pp); } /* ポインタのポインタ。 */ void func37(){ int a[] = {1,3,5,7,9}; int *p; int **pp; printf("Function : %s\n",__func__); p = a; pp = &p; printf("*p: %d, **pp: %d\n", *p, **pp); (*p)++; printf("*p: %d, **pp: %d\n", *p, **pp); } /* ポインタのポインタ。 */ void func38(){ int a[] = {1,3,5,7,9}; int *p; int **pp; printf("Function : %s\n",__func__); p = a; pp = &p; printf("*p: %d, **pp: %d\n", *p, **pp); (**pp)++; printf("*p: %d, **pp: %d\n", *p, **pp); } /* ポインタのポインタ。 */ void func39(){ int a[] = {1,3,5,7,9}; int b[] = {12,14,16,18,20}; int **pp; printf("Function : %s\n",__func__); pp = (int**)calloc(sizeof(int*), 2); *pp = a; *(pp + 1) =b; printf("**pp: %d, **(pp+1): %d\n", **pp, **(pp + 1)); free(pp); } /* ポインタのポインタ。 */ void func40(){ int a[] = {1,3,5,7,9,11,13,15}; int b[] = {12,14,16,18,20}; int **pp; printf("Function : %s\n",__func__); pp = (int**)calloc(sizeof(int*), 2); *pp = a; *(pp + 1) =b; printf("**pp: %d, **(pp+1): %d\n", **pp, **(pp + 1)); printf("*(*pp+1): %d, *(*(pp+1)+1): %d\n", *(*pp + 1), *(*(pp + 1) + 1)); printf("(**pp)+1: %d, *(*(pp+1)+1)+1: %d\n", (**pp) + 1, *(*(pp + 1) + 1) + 1); free(pp); } /* 構造体のポインタ。 */ void func41(){ struct tag{ int a; int b; } st, *p; printf("Function : %s\n",__func__); p = &st; st.a = 1; st.b = 2; printf("st.a: %d, (*p).a: %d\n", st.a, (*p).a); printf("st.b: %d, (*p).b: %d\n", st.b, (*p).b); } /* 構造体のポインタ。 */ void func42(){ struct sub{ int a; }; struct tag{ struct sub s; } st, *p; printf("Function : %s\n",__func__); p = &st; st.s.a = 10; printf("st.s.a: %d, (*p).s.a: %d\n", st.s.a, (*p).s.a); } /* 構造体のポインタ。 */ void func43(){ struct sub{ int a; } sb; struct tag{ struct sub s; struct sub *ps; } st, *p; printf("Function : %s\n",__func__); p = &st; st.ps = &sb; sb.a = 20; printf("sb.a: %d, (*st.ps).a: %d, (*(*p).ps).a: %d\n", sb.a, (*st.ps).a, (*(*p).ps).a); } /* 構造体のポインタ。 */ void func44(){ struct tag{ int a; int b; } st, *p; printf("Function : %s\n",__func__); p = &st; st.a = 1; st.b = 2; printf("st.a: %d, p->a: %d\n", st.a, p->a); printf("st.b: %d, p->b: %d\n", st.b, p->b); } /* 構造体のポインタ。 */ void func45(){ struct sub{ int a; }; struct tag{ struct sub s; } st, *p; printf("Function : %s\n",__func__); p = &st; st.s.a = 10; printf("st.s.a: %d, p->s.a: %d\n", st.s.a, p->s.a); } /* 構造体のポインタ。 */ void func46(){ struct sub{ int a; } sb; struct tag{ struct sub s; struct sub *ps; } st, *p; printf("Function : %s\n",__func__); p = &st; st.ps = &sb; sb.a = 20; printf("sb.a: %d, st.ps->a: %d, p->ps->a: %d\n", sb.a, st.ps->a, p->ps->a); } /* 構造体のポインタ。 */ void func47(){ char s[] = "ABCDEFG"; struct sub{ char *a; } sb; struct tag{ struct sub s; struct sub *ps; } st, *p; printf("Function : %s\n",__func__); p = &st; st.ps = &sb; p->ps->a = s; printf("sb.a: %s, st.ps->a: %s, p->ps->a: %s\n", sb.a, st.ps->a, p->ps->a); } /* 共用体のポインタ。 */ void func48(){ union un{ int a; int b; } u, *p; printf("Function : %s\n",__func__); u.a = 1; p = &u; printf("u.a: %d, (*p).a: %d\n", u.a, (*p).a); printf("u.b: %d, (*p).b: %d\n", u.b, (*p).b); } /* 共用体のポインタ。 */ void func49(){ union un{ int a; int b; } u, *p; printf("Function : %s\n",__func__); u.a = 1; p = &u; printf("u.a: %d, p->a: %d\n", u.a, p->a); printf("u.b: %d, p->b: %d\n", u.b, p->b); } /* 構造体のポインタ。 */ void func50(){ struct tag{ int a; int b; } *p; printf("Function : %s\n",__func__); p = (struct tag*)calloc(sizeof(struct tag), 10); printf("p(addr): %ld\n", (long)p); p++; printf("p(addr): %ld\n", (long)p); printf("size(tag): %ld\n", sizeof(struct tag)); } /* void*のキャスト。 */ void func51_sub(void* p){ int *a; a = (int*)p; printf("a: %d\n", *a); } void func51(){ int a; printf("Function : %s\n",__func__); a = 1; func51_sub(&a); } /* void*のキャスト。 */ void func52_sub(char* p){ printf("p: %s\n", p); } void func52(){ printf("Function : %s\n",__func__); func52_sub("ABCDEFG"); } /* void*のキャスト。 */ void func53_sub(void* p, int flag){ int *a; short *b; char* c; switch(flag){ case 1: a = (int*)p; printf("%d\n",*a); break; case 2: b = (short*)p; printf("%d\n",*b); break; case 3: c = (char*)p; printf("%d\n",*c); break; } } void func53(){ int a; printf("Function : %s\n",__func__); a = 1234567; func53_sub(&a, 1); func53_sub(&a, 2); func53_sub(&a, 3); } /* 関数のポインタ */ void func54_sub(){ printf("ABC\n"); } void func54(){ void (*func)(); printf("Function : %s\n",__func__); func = func54_sub; func(); } /* 関数のポインタ */ int func55_sub(int a){ return a*a; } void func55(){ int (*func)(int); printf("Function : %s\n",__func__); func = func55_sub; printf("%d\n",func(6)); } /* 関数のポインタ */ int func56_sub1(int a){ return a*a; } int func56_sub2(int a){ return a*7; } void func56(){ int (*func[])(int) = {func56_sub1, func56_sub2}; printf("Function : %s\n",__func__); printf("%d, %d\n", func[0](3), func[1](3)); } /* 関数のポインタ */ void func57_subsub(int a){ printf("a: %d\n", a); } void func57_sub(void (*func)(), int a){ func(a * 5); } void func57(){ printf("Function : %s\n",__func__); func57_sub(func57_subsub, 8); } /* 関数のポインタ */ void func58_subsub(int a){ printf("a: %d\n", a); } void func58_sub(void (*func)(), int a){ func(a * 5); } void func58(){ void (*func)() = func58_subsub; printf("Function : %s\n",__func__); func58_sub(func, 10); } /* 関数のポインタ。void*からのキャスト。 */ void func59_subsub(int a){ printf("a: %d\n", a); } void func59_sub(void *x, int a){ void (*func)() = x; func(a * 5); } void func59(){ printf("Function : %s\n",__func__); func59_sub(func59_subsub, 6); } /* 関数のポインタ。void*からのキャスト。 */ void func60_subsub(void *a, void *b){ void (*func)(void*, int) = a; func(b, 5); } void func60_sub(void *x, void *y, void *z){ void (*func)() = x; func(y, z); } void func60(){ void (*p)(void*, void*, void*); printf("Function : %s\n",__func__); p = func60_sub; p(func60_subsub, func59_sub, func59_subsub); } /* エントリポイント * 入力された数字によって呼び出す関数を分岐。 */ int main(){ char c[10]; unsigned int a; int cont = 1; pchar p = &c[0]; void (*func[])() = { func1, func2, func3, func4, func5, func6, func7, func8, func9, func10, func11, func12, func13, func14, func15, func16, func17, func18, func19, func20, func21, func22, func23, func24, func25, func26, func27, func28, func29, func30, func31, func32, func33, func34, func35, func36, func37, func38, func39, func40, func41, func42, func43, func44, func45, func46, func47, func48, func49, func50, func51, func52, func53, func54, func55, func56, func57, func58, func59, func60 }; while(cont){ fgets(c, sizeof(c), stdin); a = (unsigned int)atoi(p); a--; if(a < sizeof(func)/sizeof(func[0])){ func[a](); printf("--------\n\n"); } else { cont = 0; } } return 0; }