ポインタのポインタ

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ポインタのポインタ

Re: ポインタのポインタ

#5

by かずま » 7年前

最初の 1行に後続のデータの行数があり、
そのデータは 1行に 2個あるというものを
読み込みたいだけなら、次のように書けば済みます。

コード:

#include <stdio.h>   // fgets, sscanf, printf
#include <stdlib.h>  // malloc, free

#define MAX 256
 
int main(void)
{
    int i, n, m;
    char str[MAX];
    int (*a)[2];
 
    if (!fgets(str, sizeof(str), stdin)) return 1;
    sscanf(str, "%d%d", &n, &m);
    printf("n = %d, m = %d\n", n, m);
    a = malloc(sizeof(int[2]) * n);
    if (!a) return 2;
    for (i = 0; i < n; i++) {
        if (!fgets(str, sizeof(str), stdin)) return 3;
        sscanf(str, "%d%d", &a[i][0], &a[i][1]);
    }
    for (i = 0; i < n; i++)
        printf(" %d %d\n", a[i][0], a[i][1]);
    free(a);
    return 0;
}
どうしてもポインタのポインタを使って、元のプログラムのように
書きたいのであれば、こうなるのかな?

コード:

#include <stdio.h>   // fgets, printf
#include <stdlib.h>  // atoi, malloc, free
#include <string.h>  // strtok

#define MAX 256
#define LINE 100
 
int main(void)
{
    int i, n, m;
    char str[MAX];
    int **ppa;
    int *pa[LINE];
 
    if (!fgets(str, sizeof(str), stdin)) return 1;
    n = atoi(strtok(str, " "));
    m = atoi(strtok(NULL, " "));
    printf("n = %d, m = %d\n", n, m);
    if (n > LINE) return 2;
    ppa = pa;
    for (i = 0; i < n; i++) {
        if (!fgets(str, sizeof(str), stdin)) return 3;
        *ppa = malloc(sizeof(int) * 2);
        if (!*ppa) return 4;
        (*ppa)[0] = atoi(strtok(str, " "));
        (*ppa++)[1] = atoi(strtok(NULL, " "));
    }
    ppa = pa;
    for (i = 0; i < n; i++) {
        printf(" %d %d\n", (*ppa)[0], (*ppa)[1]);
        free(*ppa++);
    }
    return 0;
}
読み込んだ結果を表示しながら、終了時の free を実行していますが、
これらを別々にしたいなら、次のようにしましょう。

コード:

    ppa = pa;
    for (i = 0; i < n; i++) {
        printf(" %d %d\n", (*ppa)[0], (*ppa)[1]);
        ppa++;
    }
    // 上記の表示の代わりに、読み込んだデータの処理を書いてください。
    // (*ppa)[0] の代わりに pa[i][0] も使えます。
    // データが要らなくなったら、freeしましょう。
    ppa = pa;
    for (i = 0; i < n; i++) free(*ppa++);

Re: ポインタのポインタ

#4

by みけCAT » 7年前

nicora さんが書きました:*ppprobabilityofrain[0]
→ポインタppprobabilityofrain[0]のオブジェクト
*ppprobabilityofrain[1]
→ポインタppprobabilityofrain[1]のオブジェクト
++*ppprobabilityofrain[0]
→ポインタppprobabilityofrain[0]のオブジェクトを1たしたもの
++*ppprobabilityofrain[1]
→ポインタppprobabilityofrain[1]のオブジェクトを1たしたもの
コードとの対応はあっていると思います。
しかし、
  • ppprobabilityofrainが指しているpprobabilityofrainは普通の変数なので1要素の配列として扱い、ppprobabilityofrain[1]は範囲外なので読み書きしてはいけない
  • *ppprobabilityofrain[0]はint型の値であり、それをインクリメントした値に値を格納したいというのは意味がわからない
という問題があります。
nicora さんが書きました:*ppprobabilityofrain[0]に19を*ppprobabilityofrain[1]に0
++*ppprobabilityofrain[0]に20を++*ppprobabilityofrain[1]に0
をという感じで格納したいです。
なぜこのようなことをしたいのですか?
その目的に応じて、もっといい方法があるかもしれません。

Re: ポインタのポインタ

#3

by nicora » 7年前

言葉で説明するのは難しいですが...

*ppprobabilityofrain[0]
→ポインタppprobabilityofrain[0]のオブジェクト
*ppprobabilityofrain[1]
→ポインタppprobabilityofrain[1]のオブジェクト
++*ppprobabilityofrain[0]
→ポインタppprobabilityofrain[0]のオブジェクトを1たしたもの
++*ppprobabilityofrain[1]
→ポインタppprobabilityofrain[1]のオブジェクトを1たしたもの

でしょうか?

Re: ポインタのポインタ

#2

by みけCAT » 7年前

ポインタ関係の演算は演算子の優先順位などを間違えやすいので、確認のために、
  • *ppprobabilityofrain[0]
  • *ppprobabilityofrain[1]
  • ++*ppprobabilityofrain[0]
  • ++*ppprobabilityofrain[1]
が示すと思っているものをそれぞれ日本語で説明していただけますか?

ポインタのポインタ

#1

by nicora » 7年前

こんばんは。
C言語の勉強をしています。ポインタのポインタを用いて
文字列を格納する処理を作成しているのですが、何度
やっても上手くできません。
どのように改良すればよいかご指摘願えないでしょうか?

以下、期待値です。
入力値
7 3
19 0
20 0
21 60
22 30
23 10
24 10
25 90

*ppprobabilityofrain[0]に19を*ppprobabilityofrain[1]に0
++*ppprobabilityofrain[0]に20を++*ppprobabilityofrain[1]に0
をという感じで格納したいです。

コード:

 
int main(void)
{
	int i;
	int j;
	int consecutive_holidays_days;			
	int tripdays;						
	char str[MAX];
	int** ppprobabilityofrain;
	int* pprobabilityofrain;
	int  probabilityofrain[MAX];

	fgets(str, sizeof(str), stdin);/*7 3を入力*/
	consecutive_holidays_days = atoi(strtok(str, " "));
	tripdays = atoi(strtok(NULL, " "));

	for (i = 0; i < consecutive_holidays_days; i++)
	{
		pprobabilityofrain = probabilityofrain;
		ppprobabilityofrain = &pprobabilityofrain;
		fgets(str, sizeof(str), stdin);

			for (j = 0; j < LINE; j++)
			{
				//メモリの作成(※メモリがどうしてもよみとれない)
				++**ppprobabilityofrain = (int)malloc(*pprobabilityofrain);
				if (j == 0)
				{
					*ppprobabilityofrain[j] = atoi(strtok(str, " "));
				}
				else 
				{
					*ppprobabilityofrain[j] = atoi(strtok(NULL, " "));
				}
			}
	}
}

ページトップ