2017-01-02 1 views
-5

Ist es möglich, ein C++ - Programm zu schreiben, das eine vom Benutzer eingegebene Anzahl von Elementen zuweist und ihnen vom Benutzer eingegebene Werte zuweist Element der gerade zugewiesenen, ohne Zeigerarithmetik zu verwenden? Ich frage das, weil das menschliche Gehirn nicht denkt, dass "das 7. Element die Adresse des ersten Elements + 6 Schritte voraus ist"; Es kann dynamisch dynamisch erzeugte Elemente und ihre aktuellen Eigenschaften binden. Wenn dies in C++ möglich ist, würde dies natürlich die Programmausführung beschleunigen.Direkt auf ein beliebiges Element mit dynamischer Länge verweisen Anzahl der Elemente ohne Zeigerarithmetik

Beispiel-Code zu klären, was ich bin auf:

// 
// main.cpp 
// This code doesn't compile 
// but it's for clarification purposes 
// Created by Måns Nilsson on 2017-01-02. 
// Copyright © 2017 Måns Nilsson. All rights reserved. 
// 

#include <iostream> 

using namespace std; 

int main(int argc, const char * argv[]) { 
    int currval; 
    int otherval; 
    int arrlength; 
    cout<<"How many elements would you like to allocate?"<<endl<<"Your input: "; 
    cin >> arrlength; 
    int numlist[arrlength]; 

    //User inputs the element values and variables are assigned to 
    //point directly to each element 
    for(int i=0;i<arrlength;i++) { 
     cout<<"Enter a value for element "<<(i + 1)<<": "; 
     cin >> currval; 
     numlist[i] = currval; 
     int &var(i) = numlist[i]; 
    } 

     cout<<"Enter the index of the element you want to modify: "; 
     cin >> currval; 
     cout<<"Enter a new value for element "<<currval<<": "; 
     cin >> otherval; 
     var(currval-1) = otherval; 

    return 0; 
} 
+1

* "Wenn dies in C++ möglich ist, würde es natürlich die Programmausführung beschleunigen." * Huh? Warum denkst du das? –

+1

Ich bin mir nicht sicher, ob ich die Frage verstehe. Wenn Sie sagen, "int * arr = new int [someSize];", können Sie 'arr [7]' schreiben - es hat genau die gleiche Bedeutung wie '* (arr + 7)'. Was scheint wieder das Problem zu sein? –

+0

Sie beginnen bei der Adresse des ersten Elements und fügen 6 hinzu, so dass Sie zu * (arr + 6) gelangen, welches die Adresse des 7. Elements ist. Sie können jedoch nicht dynamisch neue Variablen erstellen, um die Elementadressen direkt zu kennen. Es verwendet immer noch Zeigerarithmetik. –

Antwort

0

C++ einen Verweis auf ein Element in einem neu zugewiesenen Array einzurichten erlaubt:

int *arr = new int[10]; 
int &elt6 = arr[6]; 
... 
elt6 = 12; // actually sets arr[6] 

Die hier ist, dass Sobald Sie Ihre Referenz definiert haben, verwenden Sie sie genau wie eine normale Variable, die den Speicher des Arrays teilt. Aber irgendwann müssen Sie Zeigerarithmetik verwenden, um dem Compiler mitzuteilen, auf welches Arrayelement Sie verweisen möchten.

+0

'int arr = neuer int [10];' kompiliert nicht. –

+2

Nun wird 'int & elt6 = arr +6;' nicht kompiliert. –

+0

Die einzige Möglichkeit besteht also darin, zwei Programme zu schreiben, von denen eines das andere ändert, nachdem der Benutzer die Anzahl der zuzuweisenden Elemente angegeben hat? –

Verwandte Themen