C übergibt den int-Array-Zeiger als Parameter an eine Funktion
Lesezeit: 6 Minuten
stergosz
Ich möchte den B-Int-Array-Zeiger an die Funktion func übergeben und ihn von dort aus ändern und dann die Änderungen in der Hauptfunktion anzeigen
#include <stdio.h>
int func(int *B[10]){
}
int main(void){
int *B[10];
func(&B);
return 0;
}
Der obige Code gibt mir einige Fehler:
In function 'main':|
warning: passing argument 1 of 'func' from incompatible pointer type [enabled by default]|
note: expected 'int **' but argument is of type 'int * (*)[10]'|
EDIT: neuer Code:
#include <stdio.h>
int func(int *B){
*B[0] = 5;
}
int main(void){
int B[10] = {NULL};
printf("b[0] = %d\n\n", B[0]);
func(B);
printf("b[0] = %d\n\n", B[0]);
return 0;
}
jetzt bekomme ich diese fehler:
||In function 'func':|
|4|error: invalid type argument of unary '*' (have 'int')|
||In function 'main':|
|9|warning: initialization makes integer from pointer without a cast [enabled by default]|
|9|warning: (near initialization for 'B[0]') [enabled by default]|
||=== Build finished: 1 errors, 2 warnings ===|
Nun, die Fehlermeldung erklärt es. Sie übergeben einen Zeiger auf ein Array von 10 int *aber func erwartet ein int** (was ein Zeiger auf das erste Element eines Arrays von (10, vermutlich) sein soll int*s). Wie man es repariert, hängt davon ab, was func tut.
– Daniel Fischer
5. Dezember 2012 um 19:22 Uhr
func bearbeitet einfach B-Werte wie B[0]B[1] etc..
– stergosz
5. Dezember 2012 um 19:24 Uhr
Dann wollen Sie wahrscheinlich nur vorbeikommen B. Seit B ist eigentlich ein Array, vorbei &B ist normalerweise nicht nützlich, da B kann nicht geändert werden (aber sein Inhalt kann geändert werden, und das möchten Sie tun).
– Daniel Fischer
5. Dezember 2012 um 19:26 Uhr
aktualisierte Frage mit neuem Code mit Fehlern, wenn ich versuche, einen Wert von B in der Funktion func zu bearbeiten
– stergosz
5. Dezember 2012 um 19:29 Uhr
Die Antwort auf Ihre ursprüngliche Frage ist die func sollte so deklariert werden: int func(int (*B)[10])
– neues Konto
5. Dezember 2012 um 21:04 Uhr
In Ihrem neuen Code
int func(int *B){
*B[0] = 5;
}
B ist ein Hinweis auf intdaher B[0] ist ein intund Sie können eine nicht dereferenzieren int. Entfernen Sie einfach die *,
int func(int *B){
B[0] = 5;
}
und es funktioniert.
Bei der Initialisierung
int B[10] = {NULL};
Sie initialisieren eineint mit einer void* (NULL). Da liegt eine gültige Umrechnung vor void* zu intdas funktioniert, ist aber nicht ganz koscher, da die Konvertierung implementierungsdefiniert ist und normalerweise auf einen Fehler des Programmierers hinweist, daher warnt der Compiler davor.
int B[10] = {0};
ist der richtige Weg, um eine mit 0 zu initialisieren int[10].
Albert Bonsanto
Vielleicht haben Sie versucht, dies zu tun?
#include <stdio.h>
int func(int * B){
/* B + OFFSET = 5 () You are pointing to the same region as B[OFFSET] */
*(B + 2) = 5;
}
int main(void) {
int B[10];
func(B);
/* Let's say you edited only 2 and you want to show it. */
printf("b[0] = %d\n\n", B[2]);
return 0;
}
wenn ich versuche, B zu bearbeiten[2] in func erhalte ich einige Fehler … Code: *B[2] = 5;
– stergosz
5. Dezember 2012 um 19:27 Uhr
@fxuser: “Ich bekomme einige Fehler” ist keine nützliche Problembeschreibung. Bitten Sie um Hilfe, als ob Sie die Person wären, die gefragt wird. Sie erhalten eine Fehlermeldung, weil B ist ein Hinweis auf int und B[2] gibt ein int zurück, keinen Zeiger. Sie wollen also nur B[2] = 5;
– Ed S.
5. Dezember 2012 um 19:35 Uhr
Das ist die Antwort, nach der ich gesucht habe. Warum würden Sie tun array + 2 Anstatt von array[2]?
– Julian Onofrei
13. Januar 2017 um 9:32 Uhr
Gregor
Wenn Sie tatsächlich einen Array-Zeiger übergeben möchten, ist dies der Fall
#include <stdio.h>
void func(int (*B)[10]){ // ptr to array of 10 ints.
(*B)[0] = 5; // note, *B[0] means *(B[0])
//B[0][0] = 5; // same, but could be misleading here; see below.
}
int main(void){
int B[10] = {0}; // not NULL, which is for pointers.
printf("b[0] = %d\n\n", B[0]);
func(&B); // &B is ptr to arry of 10 ints.
printf("b[0] = %d\n\n", B[0]);
return 0;
}
Aber wie in anderen Antworten erwähnt, ist dies nicht so üblich. Normalerweise wird ein Zeiger auf ein Array nur übergeben, wenn Sie ein 2D-Array übergeben möchten, wo es plötzlich viel klarer aussieht, wie unten. Ein 2D-Array wird tatsächlich als Zeiger auf seine erste Zeile übergeben.
void func( int B[5][10] ) // this func is actually the same as the one above!
{
B[0][0] = 5;
}
int main(void){
int Ar2D[5][10];
func(Ar2D); // same as func( &Ar2D[0] )
}
Der Parameter von func kann als deklariert werden int B[5][10], int B[][10], int (*B)[10]sind alle als Parametertypen gleichwertig.
Nachtrag: Sie können einen Zeiger auf ein Array von einer Funktion zurückgeben, aber die Syntax zum Deklarieren der Funktion ist sehr umständlich [10] ein Teil des Typs muss nach der Parameterliste stehen:
int MyArr[5][10];
int MyRow[10];
int (*select_myarr_row( int i ))[10] { // yes, really
return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}
Dies geschieht normalerweise wie folgt, um eine Überanstrengung der Augen zu vermeiden:
typedef int (*pa10int)[10];
pa10int select_myarr_row( int i ) {
return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}
Und ich stelle fest, dass C++ vorlagenfähige Typedefs erhält, also sollte es möglich sein, ptr_to_arr_of select_myarr_row … zu schreiben.
– Gregor
13. Dezember 2013 um 15:37 Uhr
Sunil Bojanapally
In der neuen Codezuordnung sollte sein,
B[0] = 5
In func (B) übergeben Sie nur die Adresse des Zeigers, der auf Array B zeigt. Sie können in func () als B ändern[i] oder *(B + i). Wobei i der Index des Arrays ist.
Im ersten Code heißt es in der Deklaration:
int *B[10]
sagt, dass B ein Array aus 10 Elementen ist, von denen jedes Element ein Zeiger auf ein int ist. Das heißt, B[i] ist ein int-Zeiger und *B[i] ist die Ganzzahl, die auf die erste Ganzzahl der i-ten gespeicherten Textzeile zeigt.
Siddharth Magadum
Gebrauch machen von *(B) Anstatt von *B[0]. Hier, *(B+i) impliziert B[i] und *(B) impliziert B[0], das ist *(B+0)=*(B)=B[0].
#include <stdio.h>
int func(int *B){
*B = 5;
// if you want to modify ith index element in the array just do *(B+i)=<value>
}
int main(void){
int B[10] = {};
printf("b[0] = %d\n\n", B[0]);
func(B);
printf("b[0] = %d\n\n", B[0]);
return 0;
}
t3dodson
main()
{
int *arr[5];
int i=31, j=5, k=19, l=71, m;
arr[0]=&i;
arr[1]=&j;
arr[2]=&k;
arr[3]=&l;
arr[4]=&m;
for(m=0; m<=4; m++)
{
printf("%d",*(arr[m]));
}
return 0;
}
Erich Aya
Unter Verwendung des wirklich hervorragenden Beispiels von Greggo habe ich dies als Blasensortierung zum Laufen gebracht, indem ein Array als Zeiger übergeben und eine einfache -1-Manipulation durchgeführt wurde.
#include<stdio.h>
void sub_one(int (*arr)[7])
{
int i;
for(i=0;i<7;i++)
{
(*arr)[i] -= 1 ; // subtract 1 from each point
printf("%i\n", (*arr)[i]);
}
}
int main()
{
int a[]= { 180, 185, 190, 175, 200, 180, 181};
int pos, j, i;
int n=7;
int temp;
for (pos =0; pos < 7; pos ++){
printf("\nPosition=%i Value=%i", pos, a[pos]);
}
for(i=1;i<=n-1;i++){
temp=a[i];
j=i-1;
while((temp<a[j])&&(j>=0)) // while selected # less than a[j] and not j isn't 0
{
a[j+1]=a[j]; //moves element forward
j=j-1;
}
a[j+1]=temp; //insert element in proper place
}
printf("\nSorted list is as follows:\n");
for(i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
printf("\nmedian = %d\n", a[3]);
sub_one(&a);
return 0;
}
Ich muss nachlesen, wie man Zeiger kapselt, weil mich das abgeschreckt hat.
13831400cookie-checkC übergibt den int-Array-Zeiger als Parameter an eine Funktionyes
Nun, die Fehlermeldung erklärt es. Sie übergeben einen Zeiger auf ein Array von 10
int *
aberfunc
erwartet einint**
(was ein Zeiger auf das erste Element eines Arrays von (10, vermutlich) sein sollint*
s). Wie man es repariert, hängt davon ab, wasfunc
tut.– Daniel Fischer
5. Dezember 2012 um 19:22 Uhr
func bearbeitet einfach B-Werte wie B[0]B[1] etc..
– stergosz
5. Dezember 2012 um 19:24 Uhr
Dann wollen Sie wahrscheinlich nur vorbeikommen
B
. SeitB
ist eigentlich ein Array, vorbei&B
ist normalerweise nicht nützlich, daB
kann nicht geändert werden (aber sein Inhalt kann geändert werden, und das möchten Sie tun).– Daniel Fischer
5. Dezember 2012 um 19:26 Uhr
aktualisierte Frage mit neuem Code mit Fehlern, wenn ich versuche, einen Wert von B in der Funktion func zu bearbeiten
– stergosz
5. Dezember 2012 um 19:29 Uhr
Die Antwort auf Ihre ursprüngliche Frage ist die
func
sollte so deklariert werden:int func(int (*B)[10])
– neues Konto
5. Dezember 2012 um 21:04 Uhr