En passant char tableau par référence
Je suis de passage d'un char tableau par référence, mais lorsque je serai de retour à partir de la fonction et imprimer le tableau, il n'affiche rien. Ce que je fais mal?
#include <iostream>
using namespace std;
void func(char []);
int main()
{
char a[100];
func(a);
cout << a<<endl;
return 0;
}
void func(char *array)
{
array="Inserting data in array a";
cout << array<<endl;
}
Ce qui concerne
Où voulez-vous insérer les données dans le tableau? Pouvez-vous montrer que le code?
Y êtes-vous la création d'un tableau de 100 char et le stockage de seulement 1 char...voulez-vous stocker de multiples char
assurez-vous de connaître les points suivants avant de lire les réponses. 1. " a " est une adresse.vous êtes de la copie en "tableau".Chaque chose est très bien jusqu'à maintenant. 2."Insertion de données dans le tableau" cette chaîne donne une adresse.Dans le func() fonction que vous écrasez 'array' avec cette adresse.
Non, 'a' n'est pas une adresse. 'a' est un tableau de 100 caractères. Il peut, dans de nombreuses situations, être implicitement converti en un pointeur. Mais il n'est pas un pointeur lui-même.
Non, 'a' est toujours un tableau de caractères dans ce cas. 12 caractères pour être exact (null-terminateur est implicite). Un littéral de chaîne, comme "hello world", est aussi un tableau de char en fait. Mais c'est un tableau qui existe dans la mémoire en lecture seule. Si vous ne pouvez pas le modifier. Lorsque vous faites cela:
Y êtes-vous la création d'un tableau de 100 char et le stockage de seulement 1 char...voulez-vous stocker de multiples char
assurez-vous de connaître les points suivants avant de lire les réponses. 1. " a " est une adresse.vous êtes de la copie en "tableau".Chaque chose est très bien jusqu'à maintenant. 2."Insertion de données dans le tableau" cette chaîne donne une adresse.Dans le func() fonction que vous écrasez 'array' avec cette adresse.
Non, 'a' n'est pas une adresse. 'a' est un tableau de 100 caractères. Il peut, dans de nombreuses situations, être implicitement converti en un pointeur. Mais il n'est pas un pointeur lui-même.
Non, 'a' est toujours un tableau de caractères dans ce cas. 12 caractères pour être exact (null-terminateur est implicite). Un littéral de chaîne, comme "hello world", est aussi un tableau de char en fait. Mais c'est un tableau qui existe dans la mémoire en lecture seule. Si vous ne pouvez pas le modifier. Lorsque vous faites cela:
char a[] = "hello world";
-- Le tableau "hello world", qui réside dans la mémoire en lecture seule, est copié dans le local char array 'un'. Donc non, un littéral de chaîne ne donnent pas toujours un pointeur. Il le fait dans les mêmes endroits que d'un tableau, parce que c'est un tableau.OriginalL'auteur Naruto | 2012-10-20
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas en passant le tableau par référence (ni vous, il ne vous apportera rien de bon ici). Vous passez un pointeur vers son premier élément. Vous réassignez alors que le pointeur pointer vers quelque chose d'autre à l'intérieur de la fonction. Cela n'a aucun effet sur le tableau. Si vous souhaitez modifier le contenu du tableau, alors vous avez besoin de copier des données sur la place que le pointeur pointe. Vous pouvez utiliser la fonction strcpy ou similaires:
Comme un commentaire, mais une question très importante. Nous n'avons pas besoin de traiter avec des choses comme ça en C++ plus. C'est la façon dont vous faites les choses en C. Voici comment nous faisons les choses en C++:
Vous pouvez modifier votre signature de fonction à
func(char (&array)[100])
- Mais c'est inutile dans ce cas. Vous ne pouvez pas attribuer à des tableaux, vous aurez toujours besoin d'une copie en utilisant quelque chose comme strcpy.Je suppose que je n'ai pas besoin de faire référence chose que vous avez montré. Je suis de passage du tableau par référence parce que Quand j'ai pris en entrée de l'utilisateur, le contenu du tableau a changé.
Pouvez-vous me dire pourquoi exactement ma façon de modifier les données dans le tableau à l'intérieur de func() ne fonctionne pas.
Les quatre premières phrases dans ma réponse expliquer exactement ce que.
OriginalL'auteur Benjamin Lindley
Ce que vous pouvez probablement le faire est:
Qui se traduit par: passer un tableau (
[..]
) de 10 ([10]
) caractères (char
) par renvoi ((& ..)
).OriginalL'auteur 0x499602D2
Vous pouvez passer un pointeur par référence. Pour ce faire, vous avez besoin de la syntaxe suivante:
À l'intérieur de la fonction, vous pouvez utiliser ce paramètre comme un simple pointeur. Seulement si il est modifié, ces changements sont visibles à l'extérieur.
Ce n'est pas d'aller travailler avec la façon dont le
main
passe la valeur dea
de la fonction: le code ne va pas compiler avec le message "invalid initialisation de la non-const de référence de type ‘char*&" à partir d'un temporaire de type ‘char*’"Vous êtes de droite. Prenez en compte ma remarque comme quelque chose d'autonome.
OriginalL'auteur Kirill Kobelev
Essayez ce qui suit:
Avec cela, vous verrez que le pointeur de votre tableau n'est qu'une copie de l'intérieur de la fonction. À l'attribution de "Hello World", vous modifiez uniquement l'adresse de la copie, mais pas l'adresse de votre tableau dans la fonction principale.
Cet exemple fonctionne réellement, car de cette façon vous n'avez pas de copie de votre pointeur à l'intérieur de la fonction:
Mais c'est toujours mauvais style. Lorsque l'on travaille avec des tableaux de caractères que vous devriez faire quelque chose comme ceci:
Mais comme d'autres l'ont mentionné, je voudrais utiliser std::string et le passer par référence au lieu d'utiliser des tableaux de caractères. Parce que des tableaux de caractères sont dangereux par rapport à std::string. Comme ceci:
std::string MyString;
je nechar MyString[50]
et passer à la fonction par moulage comme '(std::string)(MyString)'. EST-il ok? si non quel est l'inconvénient ?OriginalL'auteur roohan
Vous passez un pointeur vers un tableau (
func (char* array)
) et puis à l'intérieur de la fonction que vous sont en train de changer le pointeur de la valeur du point de la chaîne statique.Vous avez besoin de copier les nouvelles données dans le tableau par le biais de
strcpy()
ou passer le pointeur vers le tableau par la référence:Ou:
Mieux encore utiliser
std::vector<>
oustd::string
à la place.OriginalL'auteur mauve
J'ai utilisé les réponses ci-dessus, mais j'ai dû le prolonger, afin que je puisse imprimer la matrice de réels de taille:
OriginalL'auteur radato
erreur de première ligne iostream.h ...
et d'autre part vous n'êtes pas d'insérer n'importe quel élément dans un tableau...et vous êtes de passage à un dans votre fonction, vous devez passer l'adresse de votre tableau dans la fonction, mais avant que de réécrire le code pour avoir quelque chose dans votre tableau
<iostream>
.mais en fonction de nouveaux cas de déviation ses une erreur...de toute façon thnx je vais regarder pour que...
Les compilateurs? Cela devrait être le contraire. Les compilateurs modernes habituellement drapeau iostream.h comme obsolète ou un plat d'erreur, comme c'est le cas ici: ideone.com/m0TwXl
OriginalL'auteur Javasist