ページ 11

C言語 ポインタ

Posted: 2010年9月14日(火) 00:36
by
こんにちは。
ゲームを作ることを目標にして、C言語の勉強をしています。
そこで、確認と質問したいことがあるので質問させていただきます。

まず、確認でC言語の問題集で「文字列の長さを調べる関数 lenght(char str[/url]) をポインタで表記しろ」
という問題がありました。
そして、自分で作ったコードはこちらです。見やすく作ってないので見難いかもしれません。

#include < stdio.h>

int lenght(char *str);

int main(void)
{

char str[100];
int ans;

printf("文字列を入力してください。\n");
scanf("%s" , str);

ans = lenght(str);

printf("文字列の長さは%dです\n" , ans);

return 0;
}

int lenght(char *str)
{
int num , i;
i=0;
for(num=0 ; str[num]!='\0'; num++)
i++;

return i;
}

これでデバッグしたところ、正常に出来ました。(環境VisualC++2008)
このコードでポインタを使って表記できてますか?
確かに、関数を宣言(?)するところでは、「*」を使ってますが、lenght(char *str[/url])関数の内容で
ポインタが使われてない(?)ように見えます。この書き方で合ってるでしょうか?


もう一つの質問は、

for(num=0 ; str[num]!='\0'; num++)

の str[num] の部分で、何故 strの前に「*」を付けなくて良いのでしょうか?
確か、 str だけでは、strのアドレスを表すと書いてありました。
str に格納されているものを指すには strの前に「*」を付けると書いてあります。
ということは、 *str[num]!=・・・  と表記するべきではないでしょうか?
しかし、 * を付けるエラーになってしまいます。どうしてでしょうか?

まだまだC言語は初心者で「付けないのは当たり前だろ!」とか思うかもしれませんがよろしくお願いします。
また、質問の意味が分からなかったらすみません。

Re:C言語 ポインタ

Posted: 2010年9月14日(火) 03:46
by うしお
まず
lenghtではなくlengthではないでしょうか?

質問1
正しいと思います
また、Numはなくても良いかと思います
たとえば
int length(const char *str){
int i = 0;
for(i;str!='\0';++i){
}
return i;
}

質問2
ポインタと配列には密接な関係があります
char Array[5];
ならば、
char *p = Array;
とこの表記だとこのポインタには配列の先頭アドレスが入ります

そして、ポインタは配列と扱うことも出来ます
char a = p[3];
とアクセスも可能です(ここが質問の肝ですね!

また、
char b = *p;
も勿論可能で、

char c = *(p+3);
という取り出し方もあります(こちらは普通はあまりしないかもしれません)
この方法は「ポインタ演算」という方法です
調べてみると理解が深まるかと思います

以上のことが理解できれば
「付けないのは当たり前だろ!」
と安心して叫ぶことができるでしょう

Re:C言語 ポインタ

Posted: 2010年9月14日(火) 03:51
by シエル
質問①
ポインタを使ってるので良いと思います。

質問②
str[/url]の[/url]を使っているので、これで既にポインタが指し示す場所にアクセスしていることになります。

http://9cguide.appspot.com/15-07.html

Re:C言語 ポインタ

Posted: 2010年9月14日(火) 09:37
by fatens
>このコードでポインタを使って表記できてますか?

「文字列の長さを調べる関数 lenght(char str[/url]) をポインタで表記しろ」
この指示が何を求めているのか正確には分かりませんが……
str[num]のような配列の形を使わずに書き直す、ということではないでしょうか。
だとすれば、できていませんね。
>確かに、関数を宣言(?)するところでは、「*」を使ってますが、lenght(char *str[/url])関数の内容で
>ポインタが使われてない(?)ように見えます。この書き方で合ってるでしょうか?
ご自身も疑問に思われているようですので、上で書いたように書き直してみてはどうでしょう。

Re:C言語 ポインタ

Posted: 2010年9月14日(火) 17:39
by
皆様、丁寧なご回答ありがとうございます。

この問題は、C言語のポインタを自分でより扱える・理解するようにして作られた問題です。
なので、何故ポインタを使って表記するのか理由はありません。
一度 *str[num] と書き直してみたところ、エラーが出ました。

添付していただいた配列とポインタのサイトを参考にして、C言語のポインタの理解をより深めようと思います。

詳しい解説・指摘ありがとうございます。
何となく・・・分かったような気がします。
もう少し色々と勉強してみてより理解を深めようと思います。
これで、 叫べそう(?)です!

皆様、ありがとうございました!
これからも利用させていただこうと思います。

Re:C言語 ポインタ

Posted: 2010年9月14日(火) 17:40
by
解決し忘れ