解決済み

C言語について質問です

  • 困ってます
  • 質問No.7337801
  • 閲覧数267
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 88% (15/17)

新版 明解C言語 入門編
この本でC言語を勉強しています。
授業とかではなく自主的にやっています。

入力した文字を出力するプログラムを添字演算子なしで作る問題(演習11-1)を解いてみました。

void put_string(const char *s)
{
while(*s)
putchar(*s++);
}



int main (void)
{
char s1[128];

printf("type something: "); scanf("%s", s1);

put_string(s1);

return(0);
}



これについて二つの疑問があります。
(1)constと指定されているのにインクリメントされていたら値が変わってエラーが出ないのはなぜか
(2)main関数でないほうの関数で*を全て外すと
「パラメータ 's' は const signed char 型として定義されているので signed char * は渡せない(関数 main )」といったエラーが出るのですがなぜか

質問者が選んだベストアンサー

  • 回答No.3

ベストアンサー率 35% (25/71)

(1)
定数なのは*sです。
*s++は優先順位の関係で*(s++)と解釈され、sは定数ではないのでエラーになりません。

(2)
put_string(s1);
このs1はchar*型です。要はポインタです。
宣言がchar型なら渡せません。
お礼コメント
guhan

お礼率 88% (15/17)

丁寧にありがとうございます。
どちらの疑問も理解できました。
投稿日時 - 2012-03-02 20:54:07
感謝経済

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 18% (72/384)

>void put_string(const char *s)
のconstは文字列がput_stringによって壊されないということを示しています。ポインタを変更しないという意味ではありません。
Cのライブラリには「char*strcpy(char*dst,const char*src);」というものがありますが、src側の文字型の配列は変更しない、dst側は変更するかもしれないと宣言しています。

>main関数でないほうの関数で*を全て外すと
char型になるからです。*が付いているときはcharのポインタ型です。
お礼コメント
guhan

お礼率 88% (15/17)

ありがとうございます
投稿日時 - 2012-03-02 20:55:23
  • 回答No.1

ベストアンサー率 23% (3656/15482)

演習までの部分をきちんと理解していれば (1) のような疑問は出てこないはずです. 実際にこのような使い方をしている関数が出ていますよ.

(2) は単に「そのような変換が (デフォルトでは) できない」から.
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


感謝指数によるOK-チップ配布スタート!

ピックアップ

ページ先頭へ