2016-05-25 1 views
-1

Je suis nouveau sur stackoverflow et C et j'ai une question. Je suis obligé d'écrire un programme qui va itérer à travers un tableau, puis déréférencer le contenu à zéro. Pour une raison quelconque, mon "zero_out_array" ne changera que le premier nombre de mon tableau à zéro, et pas le reste. Voici mon code, toute aide est appréciée.Vouloir déférencer le contenu de ma matrice à zéro.

#include <stdio.h> 

void print_array(int* p_array, int num_elements) 
{ 
    printf("print_array called:\n"); 

    for (int i = 0; i < num_elements; i++) 
    { 
     printf("%d \n", p_array[i]); 
    } 
} 

void zero_out_array(int* p_array, int num_elements) 
{ 
    printf("zero_out_array called:\n"); 

    *p_array = 0; 

    for (int j = 0; j < num_elements; j++) 
    { 
     printf("%d \n", p_array[j]); 
    } 
} 

int main() 
{ 
    int main_array[] = { 15, 24, 33, 42, 51 }; 

    print_array(main_array, 5); 

    zero_out_array(main_array, 5); 

    return 0; 
} 
+3

'* p_array = 0;' fait uniquement référence au premier élément du tableau. –

Répondre

0

S'il vous plaît considérer le code modifié comme suit:

#include <stdio.h> 

void print_array(int* p_array, int num_elements) 
{ 
    printf("print_array called:\n"); 

    for (int i = 0; i < num_elements; i++) 
    { 
     printf("%d \n", p_array[i]); 
    } 
} 

void zero_out_array(int* p_array, int num_elements) 
{ 
    printf("zero_out_array called:\n"); 

    *p_array = 0; 

    for(int j = 0; j < num_elements; j++) 
     *(p_array+j)=0; 

    for (int j = 0; j < num_elements; j++) 
    { 
     printf("%d \n", p_array[j]); 
    } 
} 

int main() 
{ 
    int main_array[] = { 15, 24, 33, 42, 51 }; 

    print_array(main_array, 5); 

    zero_out_array(main_array, 5); 

    return 0; 
} 

Dans le code ci-dessus, j'ai ajouté le supplément pour la boucle:

for(int j = 0; j < num_elements; j++) 
     *(p_array+j)=0; 

*p_array des points seulement au premier élément de le tableau, j'ai donc utilisé une boucle for pour changer tous les éléments. En faisant *(p_array+j)=0, je visite itérativement tous les éléments du tableau et je les rends 0.

2

Pour tout pointeur ou un tableau p et l'indice i l'expression p[i] et *(p + i) sont les mêmes.

Maintenant, si l'indice est 0 alors nous avons p[0] qui est le même que *(p + 0) et *(p + 0) est le même que celui *(p) qui est le même que *p. C'est-à-dire, si vous avez un pointeur et le déréférencement, alors vous obtiendrez exactement ce que le pointeur pointe vers, par exemple le premier élément dans un tableau pointé par le pointeur.

Si vous souhaitez mettre à zéro tous les éléments du tableau, vous avez deux choix: Utilisez une boucle explicite et définissez chaque élément à zéro. Ou puisque vous avez un tableau d'entiers, vous pouvez utiliser memset pour définir chaque octet dans le tableau à zéro.

En utilisant memset vous pourriez faire par exemple.

memset(p_array, 0, sizeof(*p_array) * num_elements);