[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
C言語に限らず、プログラミング言語の本を読んでいると、変数のスコープという話がよくでてきますねー。
自分もプログラマの端くれですから、意味は理解しているのですが、C言語の仕様は曲者でした。
なんと、自作の関数内で宣言した変数を、mainで参照したりできるらしいです。
言語仕様的には「してはならないこと」ですが、できてしまう当たりが、C言語らしいところということらしいです。
こんな感じです。
ソース
#include <stdio.h>
char *getValue(void);
/**
* char配列を宣言して値を代入し、そのアドレスを返します。
*/
char *getValue(){
char value[80] = "abc"; /* ここで変数宣言 */
char *result;
result = value; /* ここでポインタにアドレスを渡している */
return(result);
}
int main()
{
char *result2;
result2 = getValue(); /*getValueで宣言した変数のアドレスを取得する。 */
printf("result2 : %p : %s\n",result2,result2);
return (0);
}
結果:
result2 : 0x22cc60 : abc
getValueはローカル関数で宣言した変数のポインタを返しているのですのですが、呼び出し元の関数で参照されるタイミングで、その変数の領域が削除されたわけではないので、ローカル変数で宣言した変数がたまたま参照できる、という原理らしいです。
言い換えると、いつなんどき参照できなくなるやもしれない変数の領域なわけです(というか参照しちゃダメですな)。
大きいプログラミングをしていくと大いにありそうなパターンでドキドキですね。
他の言語だとポインタというものが存在しないので、こういうことはそもそもできないわけですが。
と思ったので調べてみた。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。
というわけでCで書いてみた。
/**
* loop_max値までのFizz Buzzを計算します
*
* @see Fizz Buzz http://ja.wikipedia.org/wiki/Fizz_Buzz
*/
#include<stdio.h>
#define loop_max 100
int main(void);
int main(){
int loop;
for (loop = 1; loop <= loop_max; loop++) {
if (loop % 15 == 0) {
printf("Fizz Buzz\n");
} else if (loop % 5 == 0) {
printf("Fizz\n");
} else if (loop % 3 == 0) {
printf("Buzz\n");
} else {
printf("%d\n", loop);
}
}
return (0);
}
これで、wikipedia中のFizz Buzz仕様から外れていないと思うが、ネットでFizz Buzz書いているのみると、基本数字を表示して、3,5,15それぞれで割れた場合に、文字出力を加えるようなのもあって、そっちが正しいのか!? と思ったりしましたが、まぁそういうのは些細な問題なので、気にしないことにします。
C言語の教則本読んでると、integerは32bitでとか、charは1byteとか、よく目にするわけですが、php使っている分には、正直、そのへんのコンピューター的な事は意識しなくても書けるわけです。
逆に、C言語勉強する際に、なんちゃってプログラマーの自分には、大いなる障壁を感じるわけです。
というわけで、メモ兼ねて、残しておく。
integer
C言語でintegerを扱う場合、integerはコンパイル(実行環境)に依存するわけですが、一般的なPCは、32bitで、10進数で符号無しだと 4294967295 となるわけで、integerの最大値は4294967295となるわけですね。
よく32bitのメモリは最大4Gbyteまでって言われてて、まぁそういうもんかーと思ってたけど、実はよく分かってなかったので、調べてみたら分かった。
メモリ
メモリは、byteの並んだもの。
メモリは、1byteに対して、一つの数値アドレスが与えられる。
つまり、32bitで扱えるアドレス最大値(空間)は、2の32乗で、4294967295となる。
このアドレス一つ一つがメモリ(byte)にアクセスできるので、操作可能byteは、
4294967295byteとなるわけか。
なるほどー。
参考になったサイト
32bit
http://ja.wikipedia.org/wiki/32%E3%83%93%E3%83%83%E3%83%88
メモリの仕組み
http://www6.plala.or.jp/mnagaku/cmag/ac2000/cs06.html
で、今読んでるのが、C実践プログラミングです。
まだ途中ですが、確かに実践的で良いです。
makeについても触れられていて、あーこういう感じなのねーとか思う今日この頃です。
C実践プログラミング
http://www.amazon.co.jp/C%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96-%E3%82%AA%E3%82%A6%E3%82%A2%E3%83%AB%E3%83%A9%E3%82%A4%E3%83%B3/dp/4900900648/ref=sr_1_3?ie=UTF8&s=books&qid=1225034986&sr=8-3
どうやら、ユーザーが投稿したものが表示される仕組みみたいです。
世間の写真好き達がこぞって投稿しているのでしょう。
掲載されている写真はクォリティ高すぎですw
個人的に元の場所がどんな意味の場所かは知りませんが、この写真は格好よすぎるな~と思いましたw
http://www.panoramio.com/photos/original/2655892.jpg
| 06 | 2026/07 | 08 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |