ポインタを使用したソースを用意しました。現在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;
}