という非常に馬鹿馬鹿しい試み。
例えばint型のiという変数があったとする。
このとき、i1にiのポインタを格納したい時は
int i; int *i1=&i;
のように書けば良い。
また、ポインタのポインタということで*i1のポインタをi2に格納したい時は
int i; int *i1=&i; int **i2=&i1;
と書ける。
じゃあポインタのポインタのポインタはというと、上のように「*を増やして、前の変数名の0個以上の*を&1個に変換したものを代入」すれば良い。
int i; int *i1=&i; int **i2=&i1; int ***i3=&i2;
こんな感じに。
でもこれって手で打つのは地味に面倒。
なんとかならないかね。と思って適当に作ったプログラムが以下。
#include <stdio.h> #include <stdlib.h> //Usage: ./a [length] [name] [datatype] int main(int argc, char *argv[]){ int p=0; int length; char *name, *dtype, *ast; length=atoi(argv[1]); ast=(char *)malloc((length+1)*sizeof(char)); *ast='*'; *(ast+1)='\0'; name=argv[2]; dtype=argv[3]; for(p=0; p<length; p++){ if(p==0){ printf("%s %s;", dtype, name); }else if(p==1){ printf("%s %s%s%d=&%s;", dtype, ast, name, 1, name); }else{ printf("%s %s%s%d=&%s%d;", dtype, ast, name, p, name, p-1); } printf("\n"); if(p>=1){ *(ast+p)='*'; *(ast+p+1)='\0'; } } free(ast); }
使い方は簡単。
1個目の引数に宣言する変数の数、2個目に変数名、3個目にデータ型を指定して実行するだけ。
すると、標準出力に結果が出力される。
結果を標準出力ではなくテキストファイルに出力したい時は、
a.exe 100 name int > result.txt
のようにリダイレクトを使えばよろし。
こうすれば、nameというint型の変数が、連番で100個宣言されたテキストファイルresult.txtが生成される。最後は**(略)**name99=&name98、で終わる。
そして、これを応用して、世界一無駄に長い(であろう)Hello Worldを作ってみるとこうなる。
1008行のHello Worldプログラム:hello.c
ちなみに、コンパイルにはマシンスペックにもよるが数秒ほど時間が掛かる。ただのHello Worldであるにも関わらず、だ。
ポインタのポインタのポインタの……の、解釈をコンパイラが頑張っているんだろう。
というわけで、無駄にコンピュータに仕事させたい人は試してみると良いかもしれない。
tera2k 曰く、
まぁ,コンパイラオプションに気を付けないと最適化で水のあw(ry…
piyopoppo 曰く、
gccデフォルトの設定だとちゃんと馬鹿正直に解釈してくれたよ。
ちなみに、5000個くらい?にすると32bit環境だとメモリが足りなくてコンパイル中に「メモリたりねーばーか」って出るよ。