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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
misomiso

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

#1

投稿記事 by misomiso » 7年前

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

コード:

#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言語は少し触ったことがあるくらいの初心者です。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 7年前

C言語で、呼び出し先の関数で呼び出し元の関数のローカル変数を書き換えるには、書き換えたい変数を指すポインタを呼び出し先の関数に渡すといいでしょう。

コード:

#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で殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 7年前

コードの言語は書かれていませんね。
C++であれば、参照が使えます。

コード:

#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で殴ればいい!(死亡フラグ)

misomiso

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

#4

投稿記事 by misomiso » 7年前

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

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

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

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

返信

“C言語何でも質問掲示板” へ戻る