【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21827

関数の引数
投稿者---とおる(2005/07/11 01:36:54)


こんにちは。
いつもはVBを使っています。

いまC言語は、勉強中です。

ユーザー定義関数の引数で、よく「char *pData」みたい
なのを見かけます。
なぜ、ポインタを渡しているのか解りません。

単純に文字列データをユーザー定義関数の引数にしたいだけ
なのですが、「char pData」では駄目なのでしょうか。

それと、「char *pData」を引数にしたユーザー定義関数は
関数内で「*pData=='0'」とか書いてあるのを見たりしますが、
何故「*pData」のように書くのでしょうか。

宜しくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数の引数 21828 Blue 2005/07/11 01:50:00
<子記事> Re:関数の引数 21831 Ban 2005/07/11 02:07:36


No.21828

Re:関数の引数
投稿者---Blue(2005/07/11 01:50:00)


C言語には VB でいう String型 といわれるのもがありません。
char型と呼ばれる1文字の配列という風に文字列を扱います。

ポインタ渡しをなぜするかは、VBでいうByVal、ByRefみたいなもんです。

部分的に説明をしてもらうよりか、1から学習したほうがいいかと思います。
VBか→C言語を学習すると、いろんな相違点があります。
VBでは楽ちんだったことがCだとけっこうめんどくさいとかそういうところがあります。(文字列だったり配列だったり)

このサイトは大変初心者向けに丁寧に書かれているので参考にしてください。
初心者のためのポイント学習C言語



この投稿にコメントする

削除パスワード

No.21830

Re:関数の引数
投稿者---Blue(2005/07/11 02:07:28)


> ポインタ渡しをなぜするかは、VBでいうByVal、ByRefみたいなもんです。
この発言は根本的に間違っていました。
ポインタで渡しているのは '文字' ではなく '文字列' として処理するためです。
C言語のデータ型を理解していないとよく意味がわからないので、まず基本を学んでください。



この投稿にコメントする

削除パスワード

No.21831

Re:関数の引数
投稿者---Ban(2005/07/11 02:07:36)


>単純に文字列データをユーザー定義関数の引数にしたいだけ
>なのですが、「char pData」では駄目なのでしょうか。

char は文字列ではなく文字型です。それでは一文字しか渡せません。
Cには文字列という型はありません。文字の配列で文字列を表すので、
配列の先頭アドレスをポインタとして渡します。

>それと、「char *pData」を引数にしたユーザー定義関数は
>関数内で「*pData=='0'」とか書いてあるのを見たりしますが、
>何故「*pData」のように書くのでしょうか。

* はポインタの参照先を取りますから、
*pData == '0' は pData[0] == '0' と一緒です。
文字列の先頭が数字の '0' かどうかをチェックしてます。

但し、よく見かけると言うことであれば、恐らく
*pData == '\0' または *pData == 0 の間違いでは
ないでしょうか。この場合、空文字列かどうかのチェックになります。


この投稿にコメントする

削除パスワード

No.21833

Re2:関数の引数
投稿者---とおる(2005/07/11 11:50:44)


こんにちは。
Blueさん、Banさんありがとうございます。

一から勉強して随分たつのですが、なかなか理解できなくて...。

>char は文字列ではなく文字型です。それでは一文字しか渡せません。
>Cには文字列という型はありません。文字の配列で文字列を表すので、
>配列の先頭アドレスをポインタとして渡します。
感動しました。
なるほど...、バラバラだった知識がつながり始めている様な気が
します。

>* はポインタの参照先を取りますから、
>*pData == '0' は pData[0] == '0' と一緒です。
>文字列の先頭が数字の '0' かどうかをチェックしてます。
>
>但し、よく見かけると言うことであれば、恐らく
>*pData == '\0' または *pData == 0 の間違いでは
>ないでしょうか。この場合、空文字列かどうかのチェックになります。
もう一度、見ていた書籍確認してみます。

それとBlueさんから教えて頂いたサイトを閲覧していて、
疑問に思ったことがあります。
(http://www9.plala.or.jp/sgwr-t/c/A/rei11-2.html)

問1の答えなのですが、これは文字列を引数にし、
文字列を表示すると考えて良いのでしょうか。

先日投稿した内容を考えて、文字を表示する場合
void func( char *sr )
{
printf( "%c\n", sr[0] );
}
で良いのでしょうか。

また上記コードは、以下のものと同じと判断して
良いのでしょうか。
void func( char *sr )
{
printf( "%c\n", *sr );
}


今一度ご教示お願いします。


この投稿にコメントする

削除パスワード

No.21835

Re:Re2:関数の引数
投稿者---Blue(2005/07/11 12:02:10)


> 問1の答えなのですが、これは文字列を引数にし、
> 文字列を表示すると考えて良いのでしょうか。
そうです。

> 先日投稿した内容を考えて、文字を表示する場合
     ・・・
> で良いのでしょうか。
いいと思います。

printfの第1引き数の書式指摘文字列の
%cは char型の文字を表示してくださいと言うものです。

よって
> printf( "%c\n", sr[0] );
ですと先頭の1文字を表示するというものになります。

> また上記コードは、以下のものと同じと判断して
> 良いのでしょうか。
よいと思います。

ちなみに
&sr[ 0 ] と sr は同じ値を指します。
解答例11-2の
> void func( char *sr )
> {
> 	printf( "%s\n", sr );
> }
を
printf( "%s\n", &sr[ 0 ] );
としても同じ結果が得られます。

それと質問内容からコンパイル環境がないように思われます。
(どれも実行してみればわかるものばかりなので)
フリーのコンパイラもあるので実際に動かしてみてはいかがでしょうか?
参考
http://www9.plala.or.jp/sgwr-t/detail/EnvSet.html



この投稿にコメントする

削除パスワード

No.21848

Re:Re2:関数の引数
投稿者---とおる(2005/07/11 14:45:50)


こんにちは。
Blueさん、ありがとうございます。
勉強になります。

>&sr[ 0 ] と sr は同じ値を指します。
サイト(http://www9.plala.or.jp/sgwr-t/c/sec10-2.html)にも
書いてありましたが、意味が良く解りません。
非常に恐縮ですが、今一度ご教示願えないでしょうか。

>フリーのコンパイラもあるので実際に動かしてみてはいかがでしょうか?
ありがとうございます。
お察しの通り、コンパイラは持っていません。
早速ダウンロードします。

以上、よろしくお願いします。


この投稿にコメントする

削除パスワード

No.21849

Re:Re2:関数の引数
投稿者---まきじ(2005/07/11 15:44:48)


>>&sr[ 0 ] と sr は同じ値を指します。
>サイト(http://www9.plala.or.jp/sgwr-t/c/sec10-2.html)にも
>書いてありましたが、意味が良く解りません。

sr は先頭のアドレスが格納されています。
配列 sr の先頭は、sr[0] です。
sr[0] のアドレスを取得するには、アドレス演算子 & を
付ければよいので、&sr[0] となります。
よって、&sr[0] == sr になります。


この投稿にコメントする

削除パスワード

No.21851

Re:Re2:関数の引数
投稿者---RiSK(2005/07/11 22:13:35)


>>&sr[ 0 ] と sr は同じ値を指します。
>サイト(http://www9.plala.or.jp/sgwr-t/c/sec10-2.html)にも
>書いてありましたが、意味が良く解りません。

sr[0] と *(sr + 0) が同じであることは理解していますか?

それぞれに & 演算子を適用すると

    &sr[0] // 1

と

    &*(sr + 0) // 2

2に注目。
&* が続くとそれらは打ち消し合い「無」になります。(NULLに適用しようが,何だろうが)
そうすると

    (sr + 0)

が残りますが,

    sr

と等しいことはすぐに分かるでしょう。



この投稿にコメントする

削除パスワード

No.21864

Re3:関数の引数
投稿者---とおる(2005/07/12 11:23:20)


まきじさん、RiSKさんありがとうございます。
なんとなくですけど、解ってきたような気がします。

Blueさんに教えて頂いたサイトをもう少し勉強してみます。

ありがとうございました。


この投稿にコメントする

削除パスワード

No.21865

Re:Re3:関数の引数
投稿者---Ban(2005/07/12 13:07:01)


>Blueさんに教えて頂いたサイトをもう少し勉強してみます。

余談ですが、この掲示板自体が Blueさんが紹介されてるサイトの一部で、
上にある「ホームページ」のリンクを辿ると同じページに跳ぶことには
気づかれてますか。

> このサイトは大変初心者向けに丁寧に書かれているので参考にしてください。

「このサイト」というのはそういう意味だと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧