<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/slimelv1024/">
    <title>すらいむLv1024@wiki</title>
    <link>http://w.atwiki.jp/slimelv1024/</link>
    <atom:link href="https://w.atwiki.jp/slimelv1024/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>すらいむLv1024@wiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2010-06-04T20:08:39+09:00</dc:date>
    <utime>1275649719</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/71.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/59.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/74.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/73.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/72.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/56.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/57.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/54.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/slimelv1024/pages/51.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/1.html</link>
    <description>
      神奈川工科大学のプログラミングサークル すらいむLv1024 のwikiです。


前期の活動日は毎週 月/木 曜日です！

活動内容は、1年でやるC言語の勉強です！

-------------------------------------------------------------------

　☆　第６回 C言語勉強会　☆
　　・日にち
　　　　6/7(月) 6/10(木)
　　・時間
　　　　4限終了後 16:50～ //開始時間なので、時間前にきて準備をしてください。
　　・場所
　　　　K1号館 情報学部棟 201教室

　　サークルメンバー外の方の参加も可能です。よろしければご参加ください！


-------------------------------------------------------------------

　◎第二回目の資料をアップロードしました◎
　　見直したい方はご利用ください。
　　[[スライド&gt;http://www19.atpages.jp/slime1024/pdf/C2010/02.odp]]//odp形式です。PowerPointで見れます。
　　[[問題&gt;http://www19.atpages.jp/slime1024/pdf/C2010/02.docx]]//docx形式です。Wordで見れます。

　　第一回目の問題はこちら
　　[[スライド&gt;http://www19.atpages.jp/slime1024/pdf/C2010/01.odp]]
　　[[問題&gt;http://www19.atpages.jp/slime1024/pdf/C2010/01.docx]]


-------------------------------------------------------------------

連絡先 =&gt; twgiko＠gmail.com
＠を半角に変えて下さい。

**アクセスカウンター
合計：&amp;counter()
今日：&amp;counter(today)
昨日：&amp;counter(yesterday)


//**分からないことは？
//-[[@wiki ご利用ガイド&gt;http://atwiki.jp/guide/]]
//-[[よくある質問&gt;http://atwiki.jp/guide/category1.html]]
//-[[無料で会員登録できるSNS内の@wiki助け合いコミュニティ&gt;http://sns.atfb.jp/view_community2.php?no=112]]
//-[[@wiki更新情報&gt;http://www1.atwiki.jp/guide/pages/264.html]]
//-[[@wikiへのお問合せフォーム&gt;http://atwiki.jp/helpdesk]]
//等をご活用ください


//**@wiki助け合いコミュニティの掲示板スレッド一覧
//#atfb_bbs_list(112)

//**その他お勧めサービスについて
//-[[大容量１Ｇ、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES&gt;&gt;http://atpages.jp/]]
//-[[無料ブログ作成は@WORDをご利用ください&gt;&gt;http://atword.jp/]]
//-[[2ch型の無料掲示板は@chsをご利用ください&gt;&gt;http://atchs.jp/]]
//-[[フォーラム型の無料掲示板は@bbをご利用ください&gt;&gt;http://atbb.jp/]]
//-[[お絵かき掲示板は@paintをご利用ください&gt;&gt;http://atpaint.jp/]]
//-[[その他の無料掲示板は@bbsをご利用ください&gt;&gt;http://atbbs.jp/]]
//-[[無料ソーシャルプロフィールサービス @flabo(アットフラボ)&gt;&gt;http://sns.atfb.jp]]

//**おすすめ機能
//-[[気になるニュースをチェック&gt;http://atwiki.jp/guide/17_174_ja.html]]
//-[[関連するブログ一覧を表示&gt;http://atwiki.jp/guide/17_161_ja.html]]

//**その他にもいろいろな機能満載！！
//-[[@wikiプラグイン&gt;http://atwiki.jp/guide/category17.html]]
//-[[@wiki便利ツール&gt;http://atwiki.jp/guide/category32.html]]
//-[[@wiki構文&gt;http://atwiki.jp/guide/category16.html]]
//-[[@wikiプラグイン一覧&gt;http://www1.atwiki.jp/guide/pages/264.html]]
//-[[まとめサイト作成支援ツール&gt;http://atwiki.jp/matome/]]    </description>
    <dc:date>2010-06-04T20:08:39+09:00</dc:date>
    <utime>1275649719</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/71.html">
    <title>ｎ進数カウンタ</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/71.html</link>
    <description>
      30～40分位で作ったので非常に汚いソースですが一応うｐ
論理回路とかで使えそうなもの。というか俺が使うために用意しｔry



[[CountImp.java&gt;&gt;CountImp]] interface
[[Count.java&gt;&gt;Count]]
[[ClassTest.java&gt;&gt;ClassTest]] テスト用


ご意見ご感想はこちらへお願いします！
#comment    </description>
    <dc:date>2010-04-22T12:31:43+09:00</dc:date>
    <utime>1271907103</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/59.html">
    <title>ソース公開ページ</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/59.html</link>
    <description>
      ソース公開所です。皆さんの作ったソースを公開しましょう(^O^)/
他人のソースを見るのも勉強になります。改善点等ありましたら書いてみてください。

いが
-[[ソート&gt;ソート]]
-[[n進数カウンタ&gt;ｎ進数カウンタ]]




.    </description>
    <dc:date>2010-04-22T12:30:20+09:00</dc:date>
    <utime>1271907020</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/74.html">
    <title>CountImp</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/74.html</link>
    <description>
      	package ncount;
	
	public interface CountImp {
		public void Plus();
		public int[] GetData();
	}    </description>
    <dc:date>2010-04-22T12:25:36+09:00</dc:date>
    <utime>1271906736</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/73.html">
    <title>Count</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/73.html</link>
    <description>
      	package ncount;
	
	public class Count implements [[CountImp]]{
		int num;//繰り返した回数
		int ans;//現在の数字
		int n;//n進数
		int[] q;//Q0～3の値
		public Count(int n){
			q = new int[4];
			this.n=n;
			num=0;
			ans=0;
		}
		public void Plus(){
			num++;
			ans++;
			SetData();
		}
		public int[] GetData(){
			return q;
		}
		private void SetData(){
			if(ans==n){
				ans=0;
			}
			for(int i=0;i&lt;4;i++){
				q[i]=(ans&gt;&gt;i)&amp;1;
			}
		}
	}    </description>
    <dc:date>2010-04-22T12:24:54+09:00</dc:date>
    <utime>1271906694</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/72.html">
    <title>ClassTest</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/72.html</link>
    <description>
      	package ncount;
	
	public class ClassTest {
	
		/**
		 * @param args
		 */
		public static void main(String[] args) {
			[[Count]] c;
			c = new Count(11);
			for(int i=0;i&lt;20;i++){
				System.out.println(i+&quot;回目:&quot;);
				c.Plus();
				int ans[]=c.GetData();
				for(int j=3;j&gt;=0;j--){
					System.out.print(ans[j]+&quot; &quot;);
				}
				System.out.println(&quot;&quot;);
			}
		}
	
	}
	
countclass生成時に呼びだすコンストラクタで～進数のカウンタにするか決めてます。    </description>
    <dc:date>2010-04-22T12:23:46+09:00</dc:date>
    <utime>1271906626</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/56.html">
    <title>関数</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/56.html</link>
    <description>
      *関数とは
定められた通りの処理を実行して結果を返す一連の命令群のことです
今までもprintf関数やscanf関数などを使って来ました
C言語のプログラムはたくさんの関数が集まって出来ています
今まで使ってきたprintfなどは標準ライブラリ関数に属しています
そのほかには関数を自分で作成することが出来、これをユーザ関数と呼びます

**ライブラリ関数とは
C言語では機能ごとにライブラリファイルにまとめて用意してあります
これをライブラリ関数と呼びます


***プリプロセッサ指令とヘッダファイル
今まで[[入出力]]関数を扱うとき、#include &lt;stdio.h&gt;と最初に記述していました
includeはプリプロセッサ指令と呼ばれ、プリプロセッサと呼ばれるコンパイル前の処理を行うプログラムに命令を送る処理です
stdio.hはヘッダファイルと呼ばれ、stdio.hの中にはprintfなどを使用するために必要な宣言や定義などを行っています
関数を扱うときは必ず#includeでこのソースプログラムで関数を使いますと宣言していたのです


***標準ライブラリ関数
|標準ライブラリ関数|ヘッダファイル|
|入出力処理|stdio.h|
|文字列処理|string.h|
|文字処理|ctype.h|
|一般ユーティリティ|stdlib.h|
|数学処理|math.h|
|時間処理|time.h|
|ジャンプ処理|setjmp.h|
|シグナル処理|signal.h|
|診断処理|assert.h|

サークルの講義ではすべてstdio.h（スタンダードインアウトヘッダ）で済む範囲でこなしてしまうため、ライブラリ関数についてはあまり深くは触れません
興味がある方は先輩方に聞くか、各自ネットや書籍などで調べてください


*ユーザ関数とは
ユーザ関数とはプログラマ自身が作成する関数のことです
今まで扱ってきたプログラムは小さく、すぐに問題の場所が見つけられましたが、世の中で動いているプログラムは何千、何万行の大きなものばかりです
その処理を小分けにし、何十人、何百人で分担して作成していきます
又、小分けにすることでプログラムの修正をその関数間で行うことが出来、同じような処理の関数をまとめてプログラム間で繰り返し使うことも出来ます

**ユーザ関数の作り方
  関数の返り値の型 関数名(引数宣言){　　//ユーザ関数の定義
  　内部処理
  　　　:
  　return;
  }

言葉にするとわかりにくいと思いますが、実はやってることはmain関数と変わりません
関数は必ず返り値の型の記述と引数の記述を行っています


**ユーザ関数の使い方
  int sum(int x, int y){　　//sum関数の定義
  　int wa;
  　wa=x+y;
  　return(wa);　　　　　　//変数waを返す
  }
  
  int main(){
  　int ans,num1=5,num2=10;
  　ans=sum(num1,num2);　　//sum関数の呼び出し
  　printf(&quot;%d+%d=%d&quot;,num1,num2,ans);
  　return(0);
  }

ユーザ関数を使用するときは関数名と対応した引数を渡してあげることで使うことが出来ます
この渡す引数のことを実引数といい、関数で受け取ったものを仮引数といいます
また、関数内で関数を呼び出すことも可能です
  printf(&quot;%d+%d=%d&quot;,num1,num2,sum(num1,num2));//printf関数の中でsum関数を呼び出している


***void型
関数は必ず返り値の型と引数の記述を行っているといいましたが、main関数は引数の記述を行っていません
実は今までmain関数の引数にはvoidが指定されて居たのです
voidとは空、無といった、何も無いことを表します
引数でvoidを指定する場合はvoidを記述するか、今までどおり省略すること出来ます
引数ではvoidの記述を省略することが出来ましたが、返り値のでは省略することが出来ません
返り値で記述を省略するとint型になるので、voidと記述してあげてください
また、返り値がない場合はreturn文は省略することが出来ます


***プロトタイプ宣言
関数の宣言だけを行い処理内容を後述する方法です
必ずmain関数から処理が行われるため、関数の処理が後ろにあると流れとしてプログラムが追いやすくなります
しかし、プロトタイプ宣言の分だけ行数が増してしまうので、好みの問題といえるでしょう
  返り値の型 関数名(引数)　　　//プロトタイプ宣言
  
  int main(){
  　処理内容
  　　　:
  }
  
  返り値の型 関数名(引数)｛　　//関数の定義
  　処理内容
  　　　:
  }

***グローバル変数とローカル変数
関数外で宣言された変数をグローバル変数と呼び
関数の中で宣言された変数をローカル変数と呼びます

グローバル変数は初期化する必要が無く、すべての関数で扱うことが出来ます
ローカル変数は初期化は手動で、その関数内でしか扱うことが出来ません

グローバル変数で宣言した変数名と同名でもローカル変数で宣言することが出来ます
この場合、ローカル変数が優先的に使用されます

また、ローカル変数は関数が終了するたびに消されてしまいます
このことを変数の寿命と呼び、変数の有効範囲や寿命のことをまとめてスコープと呼ばれます


**二個以上の返り値が欲しい場合
return文では一つしか返すことが出来ません
二つ以上の返り値が欲しい場合は[[ポインタ]]を使います

  void comparison(int x,int y,int *small,int *big) {
  　if(x&lt;y){
  　　*small=x;
  　　*big=y;
  　}else{
  　　*small=y;
  　　*big=x;
  　}
  }
  
  int main(){
  　int num1=10,num2=5,min=0,max=0;
  　comparison(num1,num2,&amp;min,&amp;max);
  　printf(&quot;最小値=%d \n 最大値=%d&quot;,min,max);
  return(0);
  }


**引数に配列を使う
関数に配列を渡す場合もポインタを扱います
  int max(*array,int x){
  　int i,max;
  　for(i=0;i&lt;0x;i++){
  　　if(max&lt;array[i]){
  　　　max=array[i];
  　　}
  　}
  　return(max);
  }
  
  int main(){
  　int data[5]={6,3,5,1,7};
  　int x=5;　　//配列の要素数
  
  　printf(&quot;最大値=%d&quot;,max(data,x));
  　return(0);
  }

又、関数定義において*arrayはarray[]と記述してもよい
どちらも同じ意味なので、どちらを使うかはプログラマの好みの問題になります


*再帰的関数
C言語で自分自身と同じ関数を呼び出すことが可能です
  int fact(int n){
  　int x;
  　if(n&gt;0){
  　　x=n*fact(n-1);
  　}else{
  　　x=1;
  　}
  　return(x);
  }
  
  int main(){
  　int num=3;
  　printf(&quot;%dの階乗は%dです&quot;,num,fact(num));
  return(0);
}

上の例は階乗を求めるプログラムです
階乗処理は下記のとおり
n!=n*(n-1)!
　　:
1!=1*(1-1)!
0!=1

例を見るとfact関数の処理でnが0よりも大きい時にもう一度fact関数を呼び出しています
つまりnが0になるまでfact処理を繰り返すことになります
ただし普通の繰り返し処理と違うのは、新しい関数を呼び出しても、呼び出される前の関数は処理は処理を中断した状態になります
どういうことかわかりにくいと思うので、関数の処理始めと処理終わりにprintfを入れてみるとわかりやすいと思います
  int fact(int n){
  　int x=0;
  　printf(&quot;fact start n=%d\n&quot;,n);
  　if(n&gt;0){
  　　x=n*fact(n-1);
  　}else{
  　　x=1;
  　}
  　printf(&quot;fact end n=%d x=%d\n&quot;,n,x);
  　return(x);
  }

実行結果
  fact start n=3
  fact start n=2
  fact start n=1
  fact start n=0
  fact end n=0 x=1
  fact end n=1 x=1
  fact end n=2 x=2
  fact end n=3 x=6
  ---------------------ここまでfact関数の処理
  3の階乗は6です

if文でfact関数が呼び出されるため、n=3のときの処理は中断され、新たに呼び出されたfact関数の処理を始めます
n=2でもn=1でも同じです
n=0のときに初めてfact関数が呼び出されないのでreturn文まで到達することが出来ます
返り値は前の関数に引き渡され、中断されていた処理を再開します

再帰的処理はオーバーヘッドなどの問題があったりするため好んでは使われませんが、フラクタル図形など再帰的処理以外では記述が難しいものも存在します    </description>
    <dc:date>2010-04-13T12:26:13+09:00</dc:date>
    <utime>1271129173</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/57.html">
    <title>ポインタ</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/57.html</link>
    <description>
      *ポインタとは
**アドレスを記憶する変数です
ポインタを話す上でこれは欠かせない要素なのでよく覚えていてください
ポインタはアドレスを記憶し間接的にメモリを参照することが出来ます
メモリ上のアドレスを指定してあげることで間接的に変数や配列の操作を行うことが出来ます


**アドレス
アドレスとはメモリ上の番地のことです
プログラムもデータもこのメモリ上のアドレスに記憶されています
今まで使ってきた変数や配列はメモリ上に割り振られ、それぞれのアドレス持っています
それぞれの領域は型のデータサイズに依存し、char型なら1バイトの領域を占め、int型の要素数3の配列なら12バイトの領域を占める


***変数や配列のアドレス
  int a=123;
  char str1[]=&quot;ABC&quot;;
  char str2[][7]={&quot;TANAKA&quot;,
  　　　　　　　　&quot;SATOU&quot;,
  　　　　　　　　&quot;SUZUKI&quot;}
  
  printf(&quot;a=%d\n&quot;,a);
  printf(&quot;&amp;a=%p\n&quot;,&amp;a);
  printf(&quot;\n&quot;);
  
  printf(&quot;str1=%p\n&quot;,str1);
  printf(&quot;str1[0]=%c\n&quot;,str1[0]);
  printf(&quot;str1[1]=%c\n&quot;,str1[1]);
  printf(&quot;str1[2]=%c\n&quot;,str1[2]);
  printf(&quot;&amp;str1[0]=%p\n&quot;,&amp;str1[0]);
  printf(&quot;&amp;str1[1]=%p\n&quot;,&amp;str1[1]);
  printf(&quot;&amp;str1[2]=%p\n&quot;,&amp;str1[2]);
  printf(&quot;\n&quot;);
  
  printf(&quot;str2=%p\n&quot;,str2);
  printf(&quot;str2[0]=%p\n&quot;,str2[0]);
  printf(&quot;str2[1]=%p\n&quot;,str2[1]);
  printf(&quot;str2[2]=%p\n&quot;,str2[2]);
  printf(&quot;str2[0][0]=%c\n&quot;,str2[0][0]);
  printf(&quot;str2[1][0]=%c\n&quot;,str2[1][0]);
  printf(&quot;str2[2][0]=%c\n&quot;,str2[2][0]);
  printf(&quot;&amp;str2[0][0]=%p\n&quot;,&amp;str2[0][0]);
  printf(&quot;&amp;str2[1][0]=%p\n&quot;,&amp;str2[1][0]);
  printf(&quot;&amp;str2[2][0]=%p\n&quot;,&amp;str2[2][0]);

指定している変数は同じなのに値が違って出てきます
これは&amp;でメモリ上のアドレスを指定しているからです
&amp;(アンパサンド)はアドレス演算子と呼ばれ、変数のアドレスを取り出します
プログラマにはどこのアドレスに変数が割り当てられたのか分からないので、アドレスを求めるためにアドレス演算子を使います
scanfで使う&amp;も同じでアドレスを渡していたのです

|変数名|変数の値|
|&amp;変数|変数のアドレス|
|　|　|
|配列名|配列の先頭アドレス|
|配列名[添字]|配列要素の値|
|&amp;配列名[添字]|配列要素のアドレス|
|　|　|
|配列名|配列先頭アドレス|
|配列[行]|行の先頭要素のアドレス|
|配列[行][列]|配列要素の値|
|&amp;配列名[行][列]|配列要素のアドレス|

一次元配列のアドレスを見てもらえると分かりやすいと思いますが、配列のアドレスは並んでいます
配列は必ず並びでアドレス領域が確保されます
これは二次元配列でも同じです


***puts関数とgets関数
[[入出力]]の項で少しだけ触れたこの関数ですが、二つとも引数でアドレスを受け取れるように出来ています
  char str[256];
  puts(&quot;文字列を入力してください&quot;)
  gets(str);
  puts(str);


*ポインタ
一番最初に書きましたがポインタとはアドレスを記憶する変数です
今まで数字や文字を記憶するのに変数を使って来ました
それと同じように変数のアドレスを記憶するのがポインタ変数なのです
しかし、ポインタの意義はこの記憶されているアドレスを使って間接的にメモリを参照することです
ちょっとややこしいですが、一つ一つ確認していきましょう


**ポインタの宣言
ポインタも変数なので宣言する必要があります
  データ型* ポインタ名;
  データ型 *ポインタ名;

どちらも同じポインタ変数の宣言です
人によって宣言の仕方は違うので両方覚えておきましょう
ここで使われてる*はポインタ宣言子と呼ばれます


**アドレスの代入
当然ポインタも変数なので宣言しただけでは中に不定値が入っています
  ポインタの変数名=&amp;代入する変数名

先ほどの宣言とは違い、扱いは変数なのでここでは*は尽きません
しかし、ポインタが記憶できるのはアドレスなので、代入する変数には&amp;を忘れないでください
変数とは少し扱いが違いますが、ここまでがポインタ変数の下準備です


**メモリの参照
  *ポインタ名

ここで使われている*は間接参照演算子と呼ばれおり、ポインタの指すアドレスの中身を表します
ポインタの宣言のときにも使いましたが、あの*とはまったくの別物です
また、計算式のとき乗算として扱われる*とも別物です
乗算演算子とポインタ宣言子、間接参照子の三つの意味合いが*にあるのを覚えておきましょう


***ポインタの簡単な使用例
言葉だけでは分かりにくいと思うので実際にプログラムとして動かしてみましょう
  int num=100;
  int *p1,*p2;　　　//ポインタの宣言
  
  p1=&amp;num;　　　　 //p1にnumのアドレスを代入
  p2=p1;　　　　　　//p2にp1のアドレスを代入
  *p2=*p1+1;　　 　 //p1の指すアドレスの中身参照し、参照した値+1をp2の指すアドレスの中に代入
  
  printf(&quot;numの値は%d　numのアドレスは%pです\n&quot;,num,&amp;num);
  printf(&quot;*p1の値は%d　*p1のアドレスは%pです\n&quot;,*p1,p1);
  printf(&quot;*p2の値は%d　*p2のアドレスは%pです\n&quot;,*p2,p2);

実行結果
  numの値は101　numのアドレスは01EFD84です
  *p1の値は101　*p1のアドレスは01EFD84です
  *p2の値は101　*p2のアドレスは01EFD84です

すべて同じ値とアドレスが出てきたと思います(アドレスの出す値は環境によって変わります
p2はp1のアドレスを記憶し、p1はnumのアドレスを記憶しています
p2のアドレスの指す中身はp1であり、p1のアドレスの指す中身はnumなのです
つまりp2は間接的にnumの100を取得し、間接的にnumの値を変えることが出来たのです


**ポインタと配列
配列の場合もポインタの宣言、アドレスの代入、アドレスの参照を必ず行います
ただし、配列の場合参照する方法が二種類あります
  char name[7]=&quot;TANAKA&quot;;
  char *p1,*p2;
  int i;
  
  p1=name;
  p2=name;
  
  for(i=0;*(p1+i)!=\0;i++){//方法1
  　printf(&quot;%c&quot;,*(p1+i));
  }
  
  while(*p2!=\0){//方法2
  　printf(&quot;%c&quot;,*p2);
  　p2++;
  }

方法1はポインタの値を変えずに参照しています
この書き方で注意しなければならないのは（）です
()を忘れると*p1にiを代入すると言う式になってしまいます

方法2はポインタの値を変えて参照しています
こちらの方法は値を更新してしまっているため、もう一度使うときに更新したポインタを元に戻さないと、別のエリアを参照してしまいます
参照だけならいいですが、書き込みだった場合別のエリアのデータを破壊してしまいますので、注意が必要です


**ポインタと文字列リテラル
配列の項で文字列は書き換えることが出来ないと説明しましたが、ポインタを使うことで文字列を書き換えることが可能です
  char *p;
  p=&quot;ABC&quot;

このABCというのはメモリ上のどこかに用意された文字列です
文字列の先頭アドレスを取得することで、文字列の情報を入手することが出来ます
つまりポインタが記憶する文字列の先頭アドレスを変えれば、文字列を書き換えることが出来るのです


**ポインタの配列
ポインタでも配列を扱うことが出来ます
  データ型 *配列名[要素数]

複数の文字列は二次元配列で扱っていましたが、ポインタの配列を使うと一次元配列で扱うことが出来ます
  char *p[3]={&quot;abc&quot;,&quot;defghi&quot;,&quot;jk&quot;};
  puts(str[0]);
  puts(str[1]);
  puts(str[2]);

二次元配列と違い確保した空いてるスペースにNULL文字を入れる必要がない代わりに、文字列が並びで確保されず、文字列の先頭アドレスを記憶する領域が必要になるため、どちらを使うかは二つの特色を考えて選択しましょう    </description>
    <dc:date>2010-04-13T12:16:36+09:00</dc:date>
    <utime>1271128596</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/54.html">
    <title>配列</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/54.html</link>
    <description>
      *配列とは
仮に学生番号を入れる変数を生徒の人数分作るとします
1人2人ならいいですが、これが100人だったらとても手打ちする気にはなれません
このような同じ型で同じ目的を持つ変数をまとめて扱うもの配列といいます


**配列の扱い
***配列の宣言
  型名 配列名[要素数]

変数同様、配列もはじめ宣言しなければ使えません
配列の宣言をすると、配列名[0],配列名[1]・・・配列名[要素数－1]と宣言された要素数の数だけデータを格納する領域が作られます
この[]の中の数字のことを添字といいます
配列も変数同様、宣言だけでは中は不定値が入っています


***配列の初期化
  ①int data1[5]={1,2,3,4,5};
  ②int data2[5]={1,2,3};
  ③int data3[5]={0};
  ④int data4[]={1,2,3}
  ⑤double data5[5]={1.1,2.2,3.3,4.4,5.5};
  
  ⑥int data6[];
  ⑦int data7[3]={1,2,3,4,5];
  ⑧double data8[3];
  data8={1.1,2.2,3.3};

①　要素数を宣言し、要素数いっぱいに初期化子を与える
②　要素数を宣言し要素数より少なく、初期化子を宣言します
　　足りない分はすべて0で補われる
③　②の応用で足りない分はすべて0で補われることから、初期化子を{0}で設定することですべて0で初期化することが出来る
④　初期化子がある場合は要素数を省略することが出来ます
　　この場合、要素数は必然的に3になります
⑤　小数も同じ要領で初期化することが出来ます

⑥　初期化子が無くて、要素数を省略することは出来ません
⑦　要素数を超える初期化子の設定は出来ません
⑧　宣言時以外にまとめての代入は出来ません


***配列データの操作
配列データには添字で直接指定してデータにアクセスします
もし要素数を超えた添字を指定したとしてもエラーは出ません
しかし、その場合配列以外のデータにアクセスしています
そのエリアがプログラムに必要なデータを格納してるエリアである可能性もあります
そのエリアを書き換えたとしたら、やっぱりプログラムは動きません

配列のデータをまとめて操作したい場合はループ処理を用いる
  int kuku[9];
  int i;
  
  for(i=1;i&lt;=9;i++){
  　kuku[i-1]=i*5;　　//配列に五段を入れる
  }
  
  printf(&quot;五の段の九九を表示します\n&quot;);
  for(i=1;i&lt;=9;i++){　　
  　printf(&quot;3*%d=%d\n&quot;,i,kuku[i-1]);　//配列の要素を一つずつ表示
  }

***sizeof演算子
配列のサイズを求めるとき使う演算子です
  int data[20];
  printf(&quot;配列dataのサイズは%dです\n&quot;,sizeof(data));


*文字列とは
文字列とは一般的に複数の文字の列です
中には文字列の型があるプログラムもありますが、C言語には文字列を扱う型がありません
C言語で文字列を扱う場合は文字型の配列を使います


**文字列の扱い
***文字列の初期化
  char 配列名[要素数]={&#039;文字&#039;・・・&#039;\0&#039;}
  char 配列名[要素数]=&quot;文字列&quot;;
前者の文字列の初期化方法は数値の配列と変わりません
最後の\0は文字列の終了を示す特別なコードです
説明は後ほどします

後者は文字列にのみ使える初期化方法で、前者と違いまとめての代入が可能です
後者の方法では\0を記述しなくても、コンパイラが自動で\0を付加してくれます


***終了コード
文字列の最後には必ず\0が付きます
これを終了コード又はNULL文字といいます

何故文字列には終了コードが付くのかというと、文字というのも機械にとっては数字の集まりと変わりません
配列は宣言時の中身は不定値です
もし何かの文字と同じコードになったとしたら、それが文字なのか、不定値なのかの判断が付きません
そのため、文字列の終わりを示す終了コードが必要です
また、要素数には\0も含めることを念頭において置いてください


***文字列の操作
文字列は初期化子以外ではまとめての代入処理を行うことが出来ません
文字を配列に一つずつ代入するか、strcpy関数を用います
又、[[ポインタ]]の項で詳しく説明する方法では、文字列をまとめて書き換えることが可能ではあります

文字列の表現は三通りあります
一つ目は配列と同様ループでひとつずつ表示する方法です
  char name[7]=&quot;TANAKA&quot;;
  int i;
  
  for(i=0;i&lt;7;i++){
  　printf(&quot;%c&quot;,name[i]);
  }

しかし、これだと文字列を表示するためには毎回[[ループ文]]を書かなければいけないので、少し面倒です
もうひとつの方法は配列名を指定してあげることでまとめて表示すること出来ます
  char name[7]=&quot;TANAKA&quot;;
  printf(&quot;%s&quot;,name);
  　又は
  puts(name);

文字列の表示処理は大体こちらの二つの方法を取ります

*多次元配列
今まで扱ってきた配列のことを一次元配列といい、表にすると一方に並んでるいるものを想像してください
|1|2|3|4|5|

二次元以上の配列を多次元配列といいます
二次元配列は縦方向と横方向の二つの方向に伸びる表を想像してください
|00|01|02|03|04|
|10|11|12|13|14|
|20|21|22|23|24|


**二次元配列の操作
***二次元配列の宣言
  型名 配列名[行の要素数][列の要素数];
基本的には一次元配列と一緒ですが、二次元なので行と列の二つの要素数が必要です


***二次元配列の初期化
  ①int data1[2][3]={1,2,3,4,5,6};
  ②int data2[2][3]={{1,2,3},
  　　　　　　　　　 {4,5,6}};
  ③int data3[][3]={{1,2,3},
  　　　　　　　　　{4,5,6}};
  ④int data4[2][3]={1,2,3};
  ⑤int data5[2][3]={{1,2},
  　　　　　　　　　 {3}};
  
  ⑥int data6[2][]={{1,2,3},
  　　　　　　　　　{4,5,6}};
  ⑦int data7[][]={{1,2,3},
  　　　　　　　　 {4,5,6}};
  ⑧int data8[2][3]={1,2,3,4,5,6,7};
  ⑨int data9[2][3]={{1,2},
  　　　　　　　　　 {3,4},
  　　　　　　　　　 {5,6};

①　一次元配列同様カンマ(,)で区切って要素数いっぱいに初期化子を与える
②　二次元配列ではこの初期化の形が一般的で、行に対応させて{}区切って初期化子を与える
③　多次元配列において先頭の要素数は省略することが出来ます
④　一次元配列同様0で補われますが、この場合の要素の不足分は{1,2,3,0,0,0}で補われます
⑤　一次元配列同様0で補われますが、この場合の要素の不足分は{{1,2,0},{3,0,0}}で補われます

⑥⑦　多次元配列では先頭の要素数以外は省略できません
⑧　要素数を超える初期化子の設定は出来ません
⑨　次元の要素数が異なると、{{1,2,0},{3,4,0},{5,6,0}}と解釈され要素数より多いのでエラーとなります


***二次元配列の操作
一次元配列同様添字を指定してあげて操作してあげます
注意点も同じで要素数を超えたデータの指定は厳禁です

二次元配列のデータまとめてまとめて操作したい場合は2重ループを行います
  int kuku[9][9];
  int i,j;
  
  for(i=1;i&lt;9;i++){
  　for(j=1;j&lt;=9;j++){
  　　kuku[i-1][j-1]=i*j;　　　//九九を作成
  　}
  }
  
  printf(&quot;九九を表示します\n&quot;);
  for(i=1;i&lt;9;i++){
  　for(j=1;j&lt;=9;j++){
  　　printf(&quot;%d*%d=%d&quot;,i,j,kuku[i-1][j-1]);　//九九を一から表示
  　}
  　printf(&quot;\n&quot;);
  }


**二次元配列と文字列
複数の文字列を扱うときにも二次元配列が使えます
  char name[3][7]={&quot;TANAKA&quot;,
  　　　　　　　　 &quot;SATOU&quot;,
  　　　　　　　　 &quot;SUZUKI&quot;};
  printf(&quot;%s&quot;,name[0]);
  printf(&quot;%s&quot;,name[1]);
  printf(&quot;%s&quot;,name[2]);

文字列の表示のときは配列名だけで表示できていましたが、今回は配列名と行要素を指定しています
これにはアドレスというものが密接に関わってくるのですが、詳しいことはポインタの項でやります
配列の扱いについては、文字列になってもほとんど一緒です    </description>
    <dc:date>2010-04-13T12:04:52+09:00</dc:date>
    <utime>1271127892</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/slimelv1024/pages/51.html">
    <title>入出力</title>
    <link>https://w.atwiki.jp/slimelv1024/pages/51.html</link>
    <description>
      *出力関数
**printf関数
 #include &lt;stdio.h&gt;
 
 int main(void)
 {
 　printf(&quot;Hello, World!\n&quot;);
 　return 0;
 }

ダブルコーテーション（&quot;）で囲まれた部分を出力します

***変数表示
変数を出力する場合は出力変換指定子を使用します
|主な指定子|意味|使われるデータ型|
|%d|int型データを符号付10進数で出力|整数型|
|%f|double型データを固定小数点|浮動小数点型|
|%c|1文字として出力|文字型|
|%s|文字列として出力する|文字列|

***エスケープシーケンス
通常の方法で表現できない文字を\をつけることで表示することをエスケープシーケンスといいます
代表的なエスケープシーケンス
|\n|復帰改行|
|\a|警告音|
|\t|タブキー|
|\b|バックスペース|
|\\|\表示|
|\&#039;|&#039;の表示|
|\&quot;|&quot;の表示|
|\0|文字列終了コード|


**puts関数
 #include &lt;stdio.h&gt;
  
 int main(void)
 {
 　puts(&quot;Hello, World!&quot;);
 　return 0;
 }

文字列*sを標準出力して改行します
文字列は言いとして、*sという文字に疑問をもたれるかと思います
これは[[ポインタ]]宣言子と呼ばれ、アドレスを意味します
今はポインタについて深く理解しなくて結構です
puts関数は一行表示して改行するものだと理解しておいてください


*入力関数
**scanf関数
 #include &lt;stdio.h&gt;
  
 int main(void) 
 {
 　char ch;
 　scanf(&quot;%c&quot;,ch);
 　return 0;
 }

キーボードから変数に入力を行います
printf同様、変数に入力するときは出力変換指定子を使います
|主な指定子|意味|使われるデータ型|
|%d|int型データを符号付10進数で入力|整数型|
|%f|double型データを固定小数点で入力|浮動小数点型|
|%c|1文字として入力|文字型|
|%s|文字列として入力する|文字列|

また、数字の入力を行う場合変数の前にアンパサンド（&amp;）をつける必要があります
 scanf(&quot;%d&quot;,&amp;変数名);


**gets関数
 #include&lt;stdio.h&gt;
 
 int main(void)
 {
 　char str[256];
 　gets(str);
   return 0;
 }

キーボードから文字列を一行入力します
char宣言の後に[]が付いていますが、これは配列というもので複数のデータを扱うことの出来る機能です
今はまだ詳しく話しませんが、そういうものが必要ということを覚えておいてください

***puts関数とgets関数
上記の記述だけではprintf関数とscanf関数だけあればいいと思ってしまうかもしれません
gets関数puts関数のよい点はアドレスを扱えることです
今この段階ではきっと？を浮かべてることでしょう
今はそれでいいです
もっと先に進んで扱う必要が出てきたときに使い方を学びに来てください    </description>
    <dc:date>2010-04-13T11:55:09+09:00</dc:date>
    <utime>1271127309</utime>
  </item>
  </rdf:RDF>
