という非常に馬鹿馬鹿しい試み。
例えば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環境だとメモリが足りなくてコンパイル中に「メモリたりねーばーか」って出るよ。