2012-07-14 2 views
1

Je souhaite passer un tableau de long long à un objectif c fonction. Je voudrais que le tableau soit passé comme un pointeur, si possible, afin que la copie ne soit pas faite. J'ai écrit ce code:Pointeur vers un tableau dans l'appel de fonction Objective-C

+ (int) getIndexOfLongLongValue: (long long) value inArray: (long long []) array size: (int) count 
{ 
    for (int i =0; i < count; i++) 
    { 
     if (array[i] == value) 
      return i + 1; 
    } 
    return 0; 
} 

auquel je passe

long long varname[count]; 

comme second argument. Je me demande si je peux passer ce tableau comme un pointeur ou si cette méthode est bien. Je n'ai pas besoin de pointeurs sur les longues pages mais de pointeurs sur le tableau.

Répondre

2

est est passé en tant que pointeur (malgré la pédanterie du langage); rien ne se copie. type[] est, pour la plupart, la même chose que type*. Pour confirmer cela, vérifiez sizeof(array) dans la méthode. Vous verrez que c'est la même taille que sizeof(void*).

Si vous voulez vraiment un pointeur vers le tableau, c'est-à-dire un pointeur vers un pointeur vers les longs longs, vous devrez utiliser quelque chose comme type**; mais la seule raison de vouloir faire cela est si vous voulez modifier le pointeur de tableau sous-jacent de la méthode, ce qui est rarement le cas.

+0

Merci, mais je ne comprends toujours pas complètement. Disons que j'ai un tableau de 1000 objets (à titre d'exemple) et je le passe dans cette fonction. Est-ce que la mémoire utilisée augmente seulement de la taille d'un pointeur - 4-8 octets? – user1122069

+0

(long long *) array est le même que (long long []) array? – user1122069

+0

Le tableau vit sur le tas (généralement). Lorsque vous appelez la fonction, tout ce que vous passez est un pointeur --- l'emplacement du tableau. (Il est en fait assez difficile de passer un tableau par valeur en C/C++/Objective C, vous ne le ferez pas par accident.) Les deux 'long long *' et 'long long []', utilisés comme types de paramètres, représentent pointeurs. –

0

Objective-C est juste une enveloppe extrêmement fine autour du C normal, donc il est traité de la même façon que dans C: passant par référence.

+ (int)getIndexOfLongLongValue:(long long)value inArray:(long long *)array size:(int)count 
{ 
    for (int i = 0; i < count; i++) 
    { 
     if (array[i] == value) 
      return i + 1; 
    } 
} 

Puis dans le code qui appelle la fonction: int myIndex = [object getIndexOfLongLongValue: aValue inArray: varname size: count];

2

tableaux C toujours décroissance des pointeurs lorsqu'il est passé à une fonction ou une méthode, il est donc pas copiés dans votre exemple. Un pointeur vers long long est automatiquement un pointeur vers un tableau de long long, en vertu de l'opérateur [] étant applicable à tous les pointeurs. Puisque votre méthode ne modifie pas le tableau, vous pouvez ajouter const pour mettre en évidence ce fait dans votre API; à part ça, votre méthode est bonne.

+0

Pourriez-vous développer ce que signifie "décroissance" ici. Décomitant de quoi? Qu'est-ce qu'un tableau définit ce qu'un pointeur ne fait pas? –

+0

Je pense qu'il veut dire ici par désintégration que le type devient juste un pointeur alors qu'avant c'était un pointeur qui s'appelait un tableau. – user1122069

+0

@ MichelMüller Voir [cette question] (http://stackoverflow.com/q/1461432/335858) pour une explication. – dasblinkenlight

Questions connexes