合計 昨日 今日

関数内でのポインタの扱いについて

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: misomiso
[URL]
Date: 2017年11月11日(土) 17:06
No: 1
(OFFLINE)

 関数内でのポインタの扱いについて

メイン関数とプロトタイプ宣言された関数のポインタのアドレスを一致させたいです。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int func(char*);
 
int main(int argc, char *argv[]) {
  char *nowpoint =argv[1];
  int result = 0;
  result = func(nowpoint);
  printf("*nowpoint:%c\n", *nowpoint);
  printf("result:%d\n", result);
  return 0;
}
 
int func(char *now){
  int sum = 0;
  while(*now != '+'){
    sum += (*now - '0');
    now++;
  }
  printf("*now:%c\n", *now);
  return sum;
}


このようなコードを書きました。
コマンドライン引数として、「’1234+’」と入力し、*nowpointを一つずつずらして「+」を指した時にそれまでの数字の合計値を計算します。
関数(func)にメイン関数のポインタ(*nowpoint)を引数として渡し、関数内でそのポインタのアドレスを進めると、関数内ではポインタのアドレスが移動するのですがメイン関数内でのポインタのアドレスが移動しなくて困っています。(この場合、*nowpointは1のままですが*nowは+で終わっています。
関数(func)は返り値としてポインタが指してる値の合計値(sum)を返すものとしています。
このsumもゆくゆくは使っていくことになるのでメイン関数内の変数(result)に格納しなければなりません。

メイン関数内のポインタ(*nowpoint)と関数func内のポインタ(*now)のアドレスを一致させる(この場合、*nowをそのままで*nowpointの指す値を+にしたいです)にはどうすればよいでしょうか?

よろしくお願いいたします。
C言語は少し触ったことがあるくらいの初心者です。

Name: みけCAT
[URL]
伝説なるハッカー(680,549 ポイント)
Date: 2017年11月11日(土) 17:13
No: 2
(ONLINE)

 Re: 関数内でのポインタの扱いについて

C言語で、呼び出し先の関数で呼び出し元の関数のローカル変数を書き換えるには、書き換えたい変数を指すポインタを呼び出し先の関数に渡すといいでしょう。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int func(char**);
 
int main(int argc, char *argv[]) {
  char *nowpoint =argv[1];
  int result = 0;
  result = func(&nowpoint);
  printf("*nowpoint:%c\n", *nowpoint);
  printf("result:%d\n", result);
  return 0;
}
 
int func(char **now){
  int sum = 0;
  while(*(*now) != '+'){
    sum += (*(*now) - '0');
    (*now)++;
  }
  printf("*(*now):%c\n", *(*now));
  return sum;
}

(*now)++;以外の(*now)の括弧は無くてもいいです。
(*now)++;の括弧を外すと、演算子の優先順位の関係で*nowではなくnowがインクリメントされてしまい、エラーの原因になります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: みけCAT
[URL]
伝説なるハッカー(680,549 ポイント)
Date: 2017年11月11日(土) 17:41
No: 3
(ONLINE)

 Re: 関数内でのポインタの扱いについて

コードの言語は書かれていませんね。
C++であれば、参照が使えます。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int func(char*&);
 
int main(int argc, char *argv[]) {
  char *nowpoint =argv[1];
  int result = 0;
  result = func(nowpoint);
  printf("*nowpoint:%c\n", *nowpoint);
  printf("result:%d\n", result);
  return 0;
}
 
int func(char *&now){
  int sum = 0;
  while(*now != '+'){
    sum += (*now - '0');
    now++;
  }
  printf("*now:%c\n", *now);
  return sum;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: misomiso
[URL]
Date: 2017年11月11日(土) 17:51
No: 4
(OFFLINE)

 Re: 関数内でのポインタの扱いについて

[解決!]

お二方とも返信ありがとうございます。

すみません、言語はCでした…

ダブルポインタ使うんですね!解説も丁寧で非常に参考になりました。
C++も今後使うことになると思うので参考にさせていただきます。

質問に答えていただきありがとうございました。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]