質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

2回答

1566閲覧

ポインタ配列変数*argv[]を使わずにプログラムを書き換えたい

Arjuna

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2021/12/14 15:07

編集2021/12/14 15:45

拙く読みにくいかもしれませんがよろしくお願いいたします。

前提・実現したいこと

下記のプログラムをポインタ配列変数*argv[]を使わず、argc,argv, *argv, **argv, argv++を使って表したいのですが、どのようにしたらいいのでしょうか?

該当のソースコード

C言語

1#include <stdio.h> 2 3int main (int argc, const char * argv[]) { 4 5  int i ; 6 7  printf("argc = %d\n", argc) ; 8  printf("&argv = %p\n", argv) ; 9 10  for(i=0 ; i < argc ; i++) 11  printf("&argv[%d] = %p, argv[%d] = %p -> \"%s\", *argv[%d] = 12   ’%c’\n", i, &argv[i], i, argv[i], argv[i], i, *argv[i]) ; 13 14  return 0; 15}

###自分なりに書き換えたプログラム

C言語

1#include <stdio.h> 2 3int main (int argc, const char **argv) { 4 5 int i ; 6 7 printf("argc = %d\n", argc) ; 8 printf("&argv = %p\n", argv) ; 9 10 for(i=0 ; i < argc ; i++) 11 printf("&argv+%d = %p, argv+%d = %p -> \"%s\", *(*argv+%d) = ’%c’\n",i, &argv+i, i, *argv+i, *(argv+i), i,**(argv++)) ; 12 13 return 0; 14}

試したこと

argv は現在処理すべき文字列へのポインタである。
*argv は現在処理すべき文字列(文字へのポインタ)である。
**argv は現在処理すべき文字列の最初の文字である。
argv + 1 は現在処理すべき文字列の2字目に対するポインタである。&argv[0][1] と同じである。
だから現在処理すべき文字列の2字目は、
(*argv+1)である。

などのことを考えながらしたのですが、完成させることができませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/14 15:42

コードのご提示のされ方は、(「自分なりに書き換えたプログラム」のほうも)「該当のソースコード」のようにマークダウン記法をご利用ください。
Arjuna

2021/12/14 15:46

こんばんは。ご指摘ありがとうございます。 修正させていただきました。 よろしくお願いいたします。
jimbe

2021/12/14 16:01 編集

単純には機械的に "argv[i]" という文字列を "(*(argv+i))" という文字列に変えるだけではないでしょうか。 なお、評価順序が明確で無い中に "++" のような評価前後で値が変わるモノを含むと、順序に因っては想定外の動作になるかもしれませんのでご注意。
jimbe

2021/12/14 16:00

> argc,argv, *argv, **argv, argv++を使って もしかして "argv+i" もダメなのでしょうか。
Arjuna

2021/12/14 16:04

何度もすみません。 argc,argv, *argv, **argv, argv++のすべてを使って、プログラムを完成させたいです。 "argv+i"は、使っても大丈夫です。 よろしくお願いいたします。
cx20

2021/12/14 16:06

あぁ、[] を使わずに表現したい、ということではなく、 argc,argv, *argv, **argv, argv++ のすべてを使って表現したい、ということですね。
Arjuna

2021/12/14 16:11

説明が下手ですみません。 ポインタ配列変数*argv[]は一切使用せず,argc,argv, *argv, **argv, argv++をすべて使いプログラムを書き換えたいです。 cx20様のおっしゃる通りです。
guest

回答2

0

ベストアンサー

やりたいことは、こういうことでしょうか?

c

1#include <stdio.h> 2 3//int main (int argc, const char * argv[]) { 4int main (int argc, const char **argv) { 5 6 int i; 7 8 printf("argc = %d\n", argc); 9 printf("&argv = %p\n", argv); 10 11 for(i=0; i < argc; i++) { 12 printf("&argv[%d] = %p, argv[%d] = %p -> \"%s\", *argv[%d] = '%c'\n", i, &argv[i], i, argv[i], argv[i], i, *argv[i]); 13 printf("&(*(argv+%d))= %p, *(argv+%d) = %p -> \"%s\", *(*(argv+%d)) = '%c'\n", i, &(*(argv+i)), i, *(argv+i), *(argv+i), i, *(*(argv+i))); 14 printf("\n"); 15 } 16 17 return 0; 18}

■ 実行結果

C:\home\edu\teratail\questions\373846>hello abc def ghi argc = 4 &argv = 0080E6A0 &argv[0] = 0080E6A0, argv[0] = 0080E6B4 -> "hello", *argv[0] = 'h' &(*(argv+0))= 0080E6A0, *(argv+0) = 0080E6B4 -> "hello", *(*(argv+0)) = 'h' &argv[1] = 0080E6A4, argv[1] = 0080E6BA -> "abc", *argv[1] = 'a' &(*(argv+1))= 0080E6A4, *(argv+1) = 0080E6BA -> "abc", *(*(argv+1)) = 'a' &argv[2] = 0080E6A8, argv[2] = 0080E6BE -> "def", *argv[2] = 'd' &(*(argv+2))= 0080E6A8, *(argv+2) = 0080E6BE -> "def", *(*(argv+2)) = 'd' &argv[3] = 0080E6AC, argv[3] = 0080E6C2 -> "ghi", *argv[3] = 'g' &(*(argv+3))= 0080E6AC, *(argv+3) = 0080E6C2 -> "ghi", *(*(argv+3)) = 'g'

投稿2021/12/14 15:55

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arjuna

2021/12/14 16:14

回答ありがとうございます。 argc,argv, *argv, **argv, argv++のすべてを利用したいのですが、argv++に書き換えることができる場所はありますでしょうか? 何度もすみませんがよろしくお願いいたします。
cx20

2021/12/14 16:24

---------------------------------- printf("argv = %p, *argv = %p -> \"%s\", **argv = '%c'\n", argv, *argv, *argv, **argv); argv++; ---------------------------------- もしくは ---------------------------------- printf("argv = %p, *argv = %p -> \"%s\", **argv = '%c'\n", argv, *argv, *argv, **argv++); ---------------------------------- といった感じでしょうか。
Arjuna

2021/12/14 16:30

ご返信ありがとうございます。 実行できました。 本当にありがとうございます。
Arjuna

2021/12/15 08:38

参考情報までありがとうございます。 なんとなくでしか理解できていなかったのですが、教えていただいたサイトの図などを参考に具体的に理解できました。 問題の解説だけでなく、丁寧に教えていただきありがとうございました。 また、ご教授いただければ幸いです。
guest

0

引数宣言のconst char *argv[]const char **argvは、全く同じ意味なのでそこ以外を書き換える必要はないです。

投稿2021/12/14 15:56

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arjuna

2021/12/14 16:15

回答ありがとうございます。 argc,argv, *argv, **argv, argv++を使って、中のプログラムも書き換えたいです。 説明が下手ですみません。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問