Skip to content

Instantly share code, notes, and snippets.

@mura303
Created July 25, 2009 15:56
Show Gist options
  • Save mura303/154820 to your computer and use it in GitHub Desktop.
Save mura303/154820 to your computer and use it in GitHub Desktop.
大昔に書いたもの
/*
* 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