blog/content/post/2008/07/05/2008-07-05-00000960.md

118 lines
4.8 KiB
Markdown
Raw Normal View History

2019-03-31 11:00:21 +00:00
---
title: ポインタの勉強
author: kazu634
date: 2008-07-05
wordtwit_post_info:
- 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4117;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- C
- Programming
---
<div class="section">
<h4>
関数宣言におけるポインタ
</h4>
<p>
STDINから文字列を読み込んで、それが256文字以内の連続した[A-Za-z0-9]であれば、それを逐一表示する。
</p>
<p>
以下の二つは同じだよ。
</p>
<pre class="syntax-highlight">
<span class="synType">int</span> get_word(<span class="synType">char</span> *buf ...)
<span class="synType">int</span> get_word(<span class="synType">char</span> buf[])
</pre>
<p>
そこら辺に注意して読んでいこう!
</p>
<pre class="syntax-highlight">
<span class="synComment">/* Include Files */</span>
<span class="synPreProc">#include </span><span class="synConstant">&#60;stdio.h&#62;</span>
<span class="synPreProc">#include </span><span class="synConstant">&#60;ctype.h&#62;</span>
<span class="synPreProc">#include </span><span class="synConstant">&#60;stdlib.h&#62;</span>
<span class="synComment">/* ================ */</span>
<span class="synComment">/* === function === */</span>
<span class="synComment">/* ================ */</span>
<span class="synType">int</span> get_word(<span class="synType">char</span> *buf, <span class="synType">int</span> buf_size, <span class="synType">FILE</span> *fp)
{
<span class="synType">int</span> len;
<span class="synType">int</span> ch;
<span class="synComment">/* Go throgh the spaces of the file */</span>
<span class="synComment">/* getc --&#62; obtains the next input character (if present)</span>
<span class="synComment"> from the stream pointed at by </span>
<span class="synComment"> stream */</span>
<span class="synComment">/* isalnum --&#62; tests for any character</span>
<span class="synComment"> for which isalpha(3) or isdigit(3) is true. */</span>
<span class="synStatement">while</span> ((ch = getc(fp)) != <span class="synConstant">EOF</span> &#38;&#38; !isalnum(ch));
<span class="synComment">/* Here, variable ch contains the first character! */</span>
len = <span class="synConstant"></span>;
<span class="synStatement">do</span>{
<span class="synComment">/* buf[len] = (the pointer of the array buf[0]) + len */</span>
buf[len] = ch;
len++;
<span class="synStatement">if</span> (len &#62;= buf_size){
fprintf(<span class="synConstant">stderr</span>, <span class="synConstant">&#34;word too long.</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>);
exit(<span class="synConstant">1</span>);
}
} <span class="synStatement">while</span> ((ch = getc(fp)) != <span class="synConstant">EOF</span> &#38;&#38; isalnum(ch));
<span class="synComment">/* Add a EOF character at the end. */</span>
buf[len] = <span class="synSpecial">'\0'</span>;
<span class="synStatement">return</span> len;
}
<span class="synType">int</span> main(<span class="synType">void</span>)
{
<span class="synType">char</span> buf[<span class="synConstant">256</span>];
<span class="synComment">/* stdinとbufは別物だから切り離して考える */</span>
<span class="synStatement">while</span> (get_word(buf, <span class="synConstant">256</span>, <span class="synConstant">stdin</span>) != <span class="synConstant">EOF</span>){
printf(<span class="synConstant">&#34;&#60;&#60;</span><span class="synSpecial">%s</span><span class="synConstant">&#62;&#62;</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, buf);
}
}
</pre>
<h4>
関数へのポインタ
</h4>
<blockquote>
<p>
たとえば、
</p>
<pre class="syntax-highlight">
<span class="synType">int</span> func(<span class="synType">double</span> d);
</pre>
<p>
というプロトタイプの関数があったとき、関数funcへのポインタを格納するポインタ変数は、以下のように宣言します。
</p>
<pre class="syntax-highlight">
<span class="synType">int</span> (*func_p)(<span class="synType">double</span>);
</pre>
<p>
そして、以下のように書くと、func_pを経由してfuncを呼び出すことができます。
</p>
<pre class="syntax-highlight">
<span class="synType">int</span> (*func_p)(<span class="synType">double</span>);
func_p = func;
func_p(<span class="synConstant">0.5</span>);
</pre>
</blockquote>
<p>
ちなみに関数へのポインタ変数を格納する配列は
</p>
<pre class="syntax-highlight">
<span class="synType">int</span> (*func_p[])(<span class="synType">double</span>);
</pre>
</div>