использование указателей для отображения содержимого массива - PullRequest
3 голосов
/ 25 июля 2011

Я застрял о том, как использовать указатели для отображения массива. Я могу легко сделать это с использованием массива для цикла, но мне интересно знать, как использовать с помощью указателей, и я застрял, как вычислить начальную и конечную точку массива.

Ниже приведен пример программы

 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;     
}

Ответы [ 5 ]

3 голосов
/ 25 июля 2011

Проверка на трюк NULL работает только для строк, заканчивающихся на 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;     
}
3 голосов
/ 25 июля 2011

У вас есть несколько вариантов:

  • Вы можете передать размер вашего массива в функцию.
  • У вас может быть специальное значение "страж" (например, -1)как последний элемент вашего массива;если вы сделаете это, вы должны убедиться, что это значение не может отображаться как часть самого массива.
0 голосов
/ 25 июля 2011

Вот ответ, приятель (не проверено) ...

 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;     
}
0 голосов
/ 25 июля 2011

Функция должна знать размер массива.Существует два распространенных подхода:

  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 (или другойсоответствующий) элемент для массива:

    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 голосов
/ 25 июля 2011

Когда массив передается в качестве параметра функции, он превращается в указатель на первый элемент массива, теряя информацию о длине массива.Для обработки массива в принимающей функции (printArray) требуется способ узнать длину массива.Это можно сделать двумя способами:

  • Специальный маркер завершения, используемый для последнего элемента.Для строк это 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...