そらのうきぶくろ

Blog - Permalink

C言語で、ポインタのポインタのポインタの……以下略を無駄に使ってみたい

という非常に馬鹿馬鹿しい試み。

例えば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;

こんな感じに。
でもこれって手で打つのは地味に面倒。
なんとかならないかね。と思って適当に作ったプログラムが以下。

pointers.c

#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であるにも関わらず、だ。
ポインタのポインタのポインタの……の、解釈をコンパイラが頑張っているんだろう。
というわけで、無駄にコンピュータに仕事させたい人は試してみると良いかもしれない。

プログラミング | 2コメント

C言語で、ポインタのポインタのポインタの……以下略を無駄に使ってみたいへのコメント (2)

  • 1

    tera2k 曰く、

    まぁ,コンパイラオプションに気を付けないと最適化で水のあw(ry…

  • 2

    piyopoppo 曰く、

    gccデフォルトの設定だとちゃんと馬鹿正直に解釈してくれたよ。
    ちなみに、5000個くらい?にすると32bit環境だとメモリが足りなくてコンパイル中に「メモリたりねーばーか」って出るよ。

コメントを書く


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>