番外編 : ポインタ の 例

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

戻る