0

重複の可能性:
文字列を取得するためのCでのポインタ演算

私はCの初心者で、関数を使用して配列の要素を取得したいのですが、さまざまなオプションを試しましたが、それでも要素を取得できません。私の機能は次のとおりです。

void getelements(int *a, int cl)
{
    int *p;
    for (p=&a[0];p<&a[cl];p++)
    {
         printf("%d\n",*p);
    }
}

ソリューションはそのように機能するはずですが、最初の要素、次にメモリ位置のみを出力します。私は自分の関数を次のように呼び出しています:

int v={10,12,20,34,45};
   getelements(&v,5);

何か助けはありますか?ポインタの算術演算を使用する必要があります。ありがとう

4

5 に答える 5

1

まず、質問が開いている間はバグを修正するためにコードを更新しないでください。現在の回答のほとんどが無意味になり、以前のコードで 1 つまたは複数の問題を解決した人によるクレジットが付与されず、自分自身に関連する問題を探しているカジュアルな読者が完全に混乱します。その中の質問と回答の両方によって。更新を修正したい場合は、元の問題に加えてそれを行いますが、それがまったく別の問題である場合は、回答済みとしてマークし、それが期限である場合は信用を与え、新しいコードと別の問題で新しい質問を開きます) (理想的にはとにかく)。

今書かれているように、あなたの機能は問題ありません。しかし、あなたの本当の問題はこれです:

// compile with -Wall -Werror and look at the warning here
int v={10,12,20,34,45}; // <== WRONG
getelements(&v,5);      // <== Harmless, but bad form.

配列内のすべての要素を出力したい場合、これは次のようになります。

int v[] = {10,12,20,34,45};
getelements(v, sizeof(v)/sizeof(v[0]));

[]次の配列に注意してください。&vそれがなければ、 はintint *. さらに、エラーとして扱われる完全な警告 (gcc の場合) を使用して前のコードをコンパイルすると、宣言行-Wall -Werrorに次のようなエラーが表示されます。v

main.c:116:15: Excess elements in scalar initializer

言い換えれば、最初の要素以降はすべて無視されたため、ポインターは未定義の動作領域に飛び出していました。宣言と呼び出しを上記のものに変更すると、これに対処するだけでなく、配列またはポインター型でない限りコンパイルsizeof(v[0])さえされないため、その間違いを繰り返さないようにすることができます。後者は、そのような計算で配列ではなくポインターを使用すると、依然として頭痛の種になる可能性がありますが、それは C で行うことに対して自分自身を訓練する必要があることです.v

于 2012-12-13T06:09:05.540 に答える
0

配列自体と一緒に配列の長さを渡すのが最善です。

#include <stdlib.h>
#include <stdio.h>

void get_elements(int* values, int length)
{
    int i;
    for (i = 0; i < length; ++i)
    {
        printf("%d\n", values[i]);
    }
}

int main(int argc, char** argv)
{
    int vals[3];

    vals[0] = 0;
    vals[1] = 1;
    vals[2] = 2;

    get_elements(vals, 3);

    getchar();
    return 0;
}

元の投稿と同様のコードを使用して(メソッドパラメーターとして配列の長さを追加する前に)、次のことを行うことができます(私に言わせれば少し複雑です)。

void get_elements(int* values, int length)
{
    int *p;

    for (p = &values[0]; p < &values[length]; p++)
    {
        printf("%d\n", *p);
    }
}
于 2012-12-13T04:41:56.547 に答える
0

これを試して、うまくいくかどうか教えてください。

void getelements(int *a)
{
    int *p;
    int l=5;
    for (p=a;p<a+l;p++)
    {
         printf("%d\n",*p);
    }
}
于 2012-12-13T04:43:28.197 に答える
0

私の知識とあなたのコードを見ると、配列の長さを5にハードコードしました。配列の長さをパラメーターとして関数に渡すこともできると思います。または、この関数を使用して、目的の結果が得られるかどうかを確認できます

void getelements(int *a)
{
    int *p;
    int i = 0;
    int l=5;
    p = a
    for (i = 0;i<l;i++)
    {
         printf("%d\n",*(p + i));
    }
}
于 2012-12-13T04:48:52.220 に答える
0

実際には、配列アドレスを渡しています

getelements(&v,5) 

機能中

getelements() 

あなたはそれを配列のように扱っています!!!

void getelements(int *a, int cl)
{
    int *p;
    for (p=a;p<a+cl;p++)
    {
         printf("%d\n",*p);
    }
}

あなたが概念的にクリアされているかどうか教えてください!!!

于 2012-12-13T05:01:02.310 に答える