2011-07-25 5 views
1

配列を表示するためにポインタを使用する方法については固執しています。 forループを使用して配列で簡単に行うことができますが、ポインタ経由での使用方法を知りたいと思っています。配列の開始点と終了点を計算する方法がわかりません。以下は配列の内容を表示するためのポインタを使用

あなたは、いくつかのオプションがあり、サンプルプログラム

void printArray(int *ptr);    
{   
    //for statement to print values using array    
    for(ptr!=NULL; ptr++) // i know this doesn't work   
    printf("%d", *ptr);   
}   

int main()  
{  
    int array[6] = {2,4,6,8,10};  
    printArray(array);  
    return 0;  
} 
+0

@Everyoneは、私の疑問をクリアするための君たちに感謝のボイド(int型* ptrに、int型のサイズ)のような.. – samprat

答えて

3

チェックのみNULLが文字列を終了するために働きます。数値配列の場合は、サイズを渡す必要があります。

ここ
void printArray(int *ptr, size_t length);    
{   
    //for statement to print values using array    
    size_t i = 0; 
    for(; i < length; ++i)  
    printf("%d", ptr[i]);   
} 

void printString(const char *ptr);    
{   
    //for statement to print values using array    
    for(; *ptr!='\0'; ++ptr)   
    printf("%c", *ptr);   
}   

int main()  
{  
    int array[6] = {2,4,6,8,10};  
    const char* str = "Hello World!"; 
    printArray(array, 6);  
    printString(str); 
    return 0;  
} 
+0

接頭辞または接尾辞はforループで違いがあります。 – samprat

+0

この場合、プリインクリメントとポストインクリメントの違いはありません。私は前者を書くことに慣れています。なぜなら後者は、オブジェクトの一時的なコピーをインクリメントしているからです。これは、C++の場合と、 'operator ++ 'を定義するカスタムクラスの場合に重要です。しかし、ここではどちらの場合も同じでなければなりません。 – Praetorian

+0

清算をありがとう – samprat

3

です:

  • あなたが関数にあなたの配列のサイズを渡すことができます。
  • 配列の最後の要素として特別な "センチネル"(たとえば、-1)の値を設定できます。これを行う場合は、この値を適切な配列の一部として使用できないようにする必要があります。
+0

何か{int i = 0の場合; i <サイズ; ptr ++)printf( "%d"、*(ptr + i)); – samprat

+0

ちょうど興味がありますが、ポインタがポインタのポインタなどを使用している可能性があります。これは私の野生の推測です – samprat

+0

@samprat:はい、これは忘れないでくださいまた、「i」をインクリメントする)。 – NPE

0

配列がパラメータとして関数に渡されると、配列の最初の要素へのポインタに減衰され、配列の長さに関する情報が失われます。受信機能(printArray)で配列を処理するには、配列の長さを知る方法が必要です。これは、2つの方法で行うことができます。

  • 最後の要素に使用される特殊終了マーカー。文字列の場合、これはNULLです。あなたの例では、その値が実際のデータには決して現れない場合、-1になる可能性があります。
  • 長さパラメータをprintArrayに渡す。

これは、次のfor文を与えるだろう:

//Marker value. 
for(;*ptr != -1; ++ptr) 
    printf("%d", *ptr); 

//Length parameter 
for(int i = 0; i < length; ++i) 
    printf("%d", *(ptr+i)); 
0

関数は、配列のサイズを知る必要があります。一般的なアプローチは2つあります。

  1. 実際のサイズを関数に渡します。

    void printArray(int *ptr, size_t size) 
    { 
        int *const end = ptr + size; 
        while(ptr < end) { 
         printf("%d", *ptr++);   
        } 
    } 
    
    int main()  
    {  
        int array[6] = {2,4,6,8,10};  
        printArray(array, sizeof(array)/sizeof(array[0]));  
        return 0;  
    } 
    
  2. 明示的アレイのセンチネル0(または他の適切な)要素を提供する:NULLトリック

    void printArray(int *ptr);    
    {   
        //for statment to print values using array    
        for(*ptr != 0; ptr++) // i know this doesn't work   
        printf("%d", *ptr);   
    }   
    
    int main()  
    {  
        int array[6] = {2,4,6,8,10, NULL};  
        printArray(array);  
        return 0;  
    } 
    
+0

あなたのサンプルソリューションは私の主な問題を解決しただけでなく、疑念を少しでも取り除くのにも役立ちました。ありがとうございました – samprat

0

回答バディ(非テスト)である...

void printArray(int arr[]);    
{   
    int *ptr; 

    for(ptr = &arr[0]; ptr <= &arr[5]; ptr++) 
    { 
     if(ptr != null)  
      printf("%d", *ptr); 

     ptr++; // incrementing pointer twice, as there are ‘int' values in array which 
       //are of size 2 bytes, so we need to increment it twice.. 
    }  
}   

int main()  
{  
    int array[6] = {2,4,6,8,10};  
    printArray(array);  
    return 0;  
} 
関連する問題