Created
May 18, 2011 16:00
-
-
Save mura303/978874 to your computer and use it in GitHub Desktop.
ポインタの概念をわかるためのプログラム
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* understandpointer.c by Daisuke Nakamura | |
* | |
* ポインタの概念をわかるためのプログラム | |
* | |
* ポインタがわかりにくいのは、ポインタ関連の演算子が | |
* いろんな意味で使われていて | |
* ややこしいからだ。たとえば、変数の宣言で | |
* int *ptr; | |
* と書いたときの'*'と、文中で | |
* hoge = *ptr; | |
* と書いたときの'*'とでは、まったく意味が違うのにおなじ記号 | |
* が使われている。さらに、 | |
* | |
* main(){ | |
* int *ptr; | |
* *ptr = 100; | |
* printf( "%d\n", *ptr ); | |
* } | |
* | |
* というプログラムが偶然うまく動く(ように見える)場合がけっこう多い | |
* ことで、まちがったまま納得してしまうことが多い。 | |
* intへのポインタ型とint型とはまったく違うのに、intへのポインタ型を | |
* intのちょっとちがう版のように感じてしまうのだ。 | |
* | |
* | |
* ということで、こんなふうにしてみるのはどうでしょう。 | |
* 最初の3行は難しいので、includeファイルにして隠したほうがいいと思い | |
* ます。 | |
* | |
* | |
* | |
*/ | |
#define VALUEOF( a ) ((*a)) | |
#define ADDRESSOF( a ) ((&a)) | |
typedef int * memoryaddress; | |
int main(void) | |
{ | |
memoryaddress addr; | |
int i; | |
addr = ADDRESSOF( i ); | |
VALUEOF( addr ) = 100; | |
printf( "i=%d valueof(addr)=%d\n", i, VALUEOF(addr) ); | |
return 0; | |
} | |
/* | |
* ポインタの概念を教えるときによく使われる、値を交換する | |
* 関数。 | |
*/ | |
void swapvalue( memoryaddress a, memoryaddress b ) | |
{ | |
int tmp; | |
tmp = VALUEOF( a ); | |
VALUEOF( a ) = VALUEOF( b ); | |
VALUEOF( b ) = tmp; | |
} | |
int main2(void) | |
{ | |
int a, b; | |
a = 1; | |
b = 200; | |
printf( "before a=%d b=%d\n", a, b ); | |
swapvalue( ADDRESSOF(a) , ADDRESSOF(b) ); | |
printf( "after a=%d b=%d\n", a, b ); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment