2016-06-25 9 views
-1

Ich versuche, meinen Code neu zu schreiben, der das Benutzereingabearray übernimmt, zu der Funktion geht und Nullen zwischen jeder Zahl hinzufügt und sie in Array 2 speichert. Mein Quellcode funktioniert gut, aber ich habe Probleme beim Versuch Um es so zu machen, dass es Zeigerarithmetik verwendet, nur damit die Funktion jedes Array-Element besucht, kann es kein Subscripting sein. Was können Sie mir über meinen Code oder Vorschläge dazu sagen?C array Zeigerarithmetik

Quellcode:

#include <stdio.h> 

void insert0(int n, int a1[], int a2[]); 

int main(void) { 

    int i;  
    int n; 

    printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a[n]; 
    int b[2*n]; 

    printf("Enter %d numbers for the array: ", n); 
    for (i = 0; i < n; i++){  
     scanf("%d", &a[i]); 
    } 

    insert0(n, a, b); 

    printf("Output array:"); 
    for (i = 0; i < 2*n; i++){ 
     printf(" %d", b[i]); 
     printf("\n"); 
    } 
    return 0; 
} 

void insert0(int n, int a[], int b[]) { 

    int i, j = 0; 

    for(i = 0; i < n; i++, j+=2){  
    b[j]= a[i];  
     b[j+1] = 0; 
    } 
} 

Mein Arithmetik:

#include <stdio.h> 

    void insert0(int n, int *a1, int *a2); 

    int main(void) { 

     int i;  
     int n; 

     printf("Please enter the length of the input array: "); 
     scanf("%d", &n); 

     int a1[n]; 
     int a2[2*n]; 

     printf("Enter %d numbers for the array: ", n); 
     for (i = 0; i < n; i++){  
      scanf("%d", &a2[i]); 
     } 

//not sure if this is how you call it, I've seen it called with arr 
     insert0(n, a1, a2); 

     printf("Output array:"); 
     for (i = 0; i < 2*n; i++){ 
      printf(" %d", a2[i]); 
      printf("\n"); 
     } 
     return 0; 
    } 

    void insert0(int n, int *a1, int *a2) { 

     int *p; 
     int j = 0; 

     // I think I translated this properly  
     for(p = a1; p < a1+n; p++, j+=2){ 
      a2+j = a1+p; 
      //unsure how to get a2[j+1] to still work here with pointer 
      a2(j+1) = 0; 
     } 
    } 

Antwort

0

Dies ist eine Antwort, die eine Demo in der Effizienz der Verwendung von Zeigerarithmetik zu sein, nicht beabsichtigt ist, sondern zu zeigen, wie Array-Indizierung (Subskribierung) übersetzt in Zeigerarithmetik, angewandt auf Ihre Code. Bitte werfen Sie einen Blick auf this SO post mit wertvollen Informationen aus dem C Standard.

Ihr Code hat auch einige logische Bugs, Lesen und Schreiben von falschen Arrays, etc ... Sie können sie leicht selbst finden. Hier ist ein funktionierendes Update:

#include <stdio.h> 

void insert0(int n, int *a1, int *a2) { 
    int p; //just a normal int for counter 
    int j = 0; 

    for(p = 0; p < n; p++, j+=2){ 
     *(a2+j) = *(a1+p); //values pointed at are getting assigned 
          //equivalent to a2[j] = a1[p] 
     if(p < n - 1)  //we insert only between numbers 
     *(a2 + j + 1) = 0; //pointer pointing at memory into which 0 is copied incremented by 1 
    } 
} 


int main(void) { 
    int i;  
    int n; 

    printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a1[n]; 
    int a2[2*n]; //one element too long, should be a2[n+n-1]; 

    printf("Enter %d numbers for the array: ", n); //reading into smaller array 
    for (i = 0; i < n; i++){  
     scanf("%d", &a1[i]); 
    } 

    insert0 (n, a1, a2); //this is OK 

    printf("Output array: "); 
    for (i = 0; i < 2*n - 1; i++){ 
    printf(" %d", a2[i]);    //printing from the bigger, zero-padded array 
    } 
    printf("\n"); 
    return 0; 
} 
+0

Würde der DVer bitte kommentieren, um die Antwort zu verbessern? Danke – user3078414

+0

Ihre Antwort ist solide und leicht zu demonstrieren, wie Zeigerarithmetik zu verwenden, meiner Meinung nach (ein Anfänger zu Zeigerarithmetik) es ist geradlinig und muss nicht verbessert werden. Ich würde es benutzen und wahrscheinlich in Zukunft wieder darauf schauen, wenn ich Zeigerarithmetik verwenden muss. – user6124417

2

Sie müssen dereferenzieren den Zeiger.

a2+j = a1+p; 

Hat keine Wirkung. Das heißt "setze die Adresse a2 + j auf die Adresse a1 + p", was du nicht tun kannst. Um den Wert bei a2 + j auf die bei a1 + p gespeicherten Wert gespeichert eingestellt haben, müssen Sie dies tun:

*(a2+j) = *(a1+p) 

Sie benötigen eine Zeigerarithmetik in Klammern umschließen, und verwenden Sie den Dereferenzierungsoperator darauf.

a1 + p, obwohl, ist nicht die Adresse, die Sie wollen. speichert die tatsächliche Adresse, nicht nur den Offset, so dass Sie wahrscheinlich nur wollen p.

1

Problem 1:

Hier im Code:

int a1[n]; 
int a2[2*n]; 

printf("Enter %d numbers for the array: ", n); 

for (i = 0; i < n; i++) 
{  
    scanf("%d", &a2[i]); //maybe you are using wrong array to input elements 
} 
  • Ich denke, hier müssen Sie Elemente in a1 Array scannen, wie es Größe ist, ist n und Sie n Elemente scannen. ..
  • aber Sie scannen Elemente in a2 und weiter in der insert0() Fu nction Sie Umschreiben der Elemente von a2 mit Hilfe von a1, die nicht initialisiert ist ...

Lösung:

Scan-Elemente in a1

for (i = 0; i < n; i++) 
{  
    scanf("%d", &a1[i]); //scanning into `a1` 
} 

Problem 2:

  • Hinweis: ein weiterer Punkt ist zu beachten, dass für a2[], (2*n)-1 Elemente genug sind, wie Sie nur Nullen zwischen den Zahlen i zuweisen.e,

Beispiel:

1,1,1 // 3 elements 

1,0,1,0,1 // (2*3)-1=5 elements after inserting 

Lösung:

printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a1[n]; 
    int a2[(2*n)-1]; 

und schließlich ....

aber ich habe Schwierigkeiten, es so zu machen, dass es Zeigerarithmetik verwendet nur für die Funktion, jedes Arrayelement zu besuchen, es kann nicht Subskripting sein.

Ja, Subskripting kann verwendet werden!

auf diese Weise:

void insert0(int n, int *a1, int *a2) 
{ 

    int j = 0; 

    for(j=0;j<(2*n)-1; j++) 
    { 
     if(j%2!=0) 
      a2[j]=0; 
     else 
      a2[j]=a1[j/2]; 
    } 
} 

Also Ihr Code wäre:

#include <stdio.h> 

    void insert0(int n, int *a1, int *a2); 

    int main(void) 
    { 

    int i; 
    int n; 

    printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a1[n]; 
    int a2[(2*n)-1]; 

    printf("Enter %d numbers for the array: ", n); 
    for (i = 0; i < n; i++) 
    { 
     scanf("%d", &a1[i]); 
    } 

    insert0(n, a1, a2); 

    printf("Output array:"); 
    for (i = 0; i < 2*n-1; i++) 
    { 
     printf(" %d", a2[i]); 
     printf("\n"); 
    } 
    return 0; 
} 

void insert0(int n, int *a1, int *a2) 
{ 

    int j = 0; 

    for(j=0;j<(2*n)-1; j++) 
    { 
     if(j%2!=0) 
      a2[j]=0; 
     else 
      a2[j]=a1[j/2]; 
    } 
} 

Eingang:

3 
1 2 3 

Ausgang:

1 
0 
2 
0 
3 
+1

Sehr interessant, wie Sie sonst noch Aussagen hier verwendet. Daran habe ich nie gedacht. Trotzdem gute und sehr hilfreiche Antwort. – user6124417

+0

kein Problem @ user6124417 :) – Cherubim