11
votes

Quelle est la différence entre les pointeurs et les variables globales en C?

Je lis, je lis, je lis Le livre C pour essayer d'obtenir une meilleure fondation dans C. Bien que je pense que je pense que je reçois généralement le concept de pointeurs, une chose qui me tient à moi, c'est que cela semble généraliser tout ce qu'il précise dans une variable globale (par exemple, la possibilité d'utiliser des pointeurs pour renvoyer des valeurs de Void < / Code> Les fonctions), qui portent naturellement avec tout ce que les dangers présentaient, je suppose.

Mis à part le fait qu'un pointeur fait référence à une variable ou d'index spécifique dans une matrice, ce que est la différence entre un pointeur et une variable globale?


4 commentaires

Je pense que c'est la première fois que j'ai vu la phrase "le livre c" faisant référence à une œuvre autre que K & R.


Les deux sont complètement différents.


Oui, j'ai remarqué qu'après avoir regardé le lien avant de commencer.


Je commence avec C & C ++ maintenant et je pensais exactement la même chose.


6 Réponses :


0
votes

concepts complètement différents. Vous pouvez avoir des pointeurs aux variables globales et locales. Il n'y a rien d'associé les deux.

Aussi, à partir d'une fonction, vous pouvez certainement renvoyer un pointeur sur une variable scopée dans cette fonction. Mais c'est une mauvaise idée puisque la variable existait sur la pile de la fonction et c'est maintenant parti.


0 commentaires

8
votes

Une variable globale est une variable accessible dans n'importe quelle portée. Un pointeur est une variable contenant l'adresse où quelque chose vit.

Ils ne sont pas directement liés les uns aux autres.

Une variable de pointeur peut être dans une portée globale ou locale et peut également indiquer une variable dans la portée globale, locale ou aucune portée (comme s'il se détache du tas ou adressant certaines lignes Dio).


0 commentaires

7
votes

Il y a une énorme différence. À part les "autres" utilisations des pointeurs (qui incluent de traiter avec des chaînes et des tableaux et de construire des structures de données dynamiques telles que des arbres et des listes liées), à l'aide d'un pointeur pour donner un autre accès à une variable locale est beaucoup plus flexible et contrôlé que le partage une variable globale entre ces deux fonctions.

Premièrement, il permet de fournir la fonction appelée d'avoir accès aux variables différentes à des moments différents. Pensez à quel point il serait plus laborieux d'utiliser scanf () s'il a toujours enregistré ses résultats dans les mêmes variables globales.

Deuxièmement, la transmission d'un pointeur à une autre fonction vous rend beaucoup plus conscient du fait que cette fonction sera en mesure de modifier l'objet. Si vous utilisez une variable globale dans le même but, il est facile d'oublier quelles fonctions modifient le global et qui ne le font pas.

Troisièmement, les variables globales consomment la mémoire pour la vie de votre programme. Les variables locales sont relâchées lorsque leur fonction contenant se termine et des données allouées de manière dynamique sont libérées lorsqu'il est gratuit d. Les variables globales peuvent donc parfois être une perte de mémoire considérable.

L'utilisation des pointeurs conduit au danger de faire référence à des variables qui n'existent plus, il faut donc prendre des précautions. Mais c'est le plus souvent un problème lorsqu'il existe des structures de données mondiales ou longues complexes qui sont souvent une faiblesse de conception.

Les globaux gênent simplement la bonne conception de programmes modulaires et les pointeurs offrent souvent un meilleur moyen d'atteindre les mêmes choses.


0 commentaires

3
votes

"pointeur" est une variable qui vous indique comment arriver à une valeur: c'est l'adresse de la valeur que vous aimez. Vous la déréférence il (avec *) pour atteindre la valeur.

"global" définit la portée de la variable: n'importe où dans le programme peut dire le nom et obtenir la valeur.

Vous pouvez avoir des pointeurs locaux ou des non-pointeurs mondiaux. Les concepts sont complètement orthogonaux.


0 commentaires

21
votes

Ce sont des bêtes très différentes. Pour mieux expliquer, laissez-moi définir les deux.

Pointeurs:

Une variable contient quelques données. Un pointeur est un type de données qui fait référence à un autre morceau de mémoire. Pensez-y comme un signe qui dit "là-bas ----->" pointant à un objet de quelque sorte. Par exemple, les chaînes en C ne sont qu'un pointeur sur un caractère et, par convention, vous savez qu'il y a plus de caractères qui lui suivent jusqu'à un caractère \ 0 . C utilise largement les pointeurs, car il n'y a pas d'autre mécanisme de partage d'informations communes entre des parties du programme, à l'exception de ....

variables globales:

Dans un programme, vous avez des variables dans chaque fonction. Ceux-ci peuvent être les paramètres à la fonction et ceux définis à l'intérieur. De plus, vous avez ce que l'on appelle des variables globales. Ces variables stockent des informations que toutes les fonctions d'un fichier peuvent accéder. Cela peut être utile de transmettre des choses comme un état global autour ou la configuration. Par exemple, vous pouvez avoir un appelé déboges que votre code vérifie avant d'imprimer des messages ou pour stocker un objet State global, comme le score dans un jeu vidéo.

Ce que je pense me confondre: Les deux peuvent être utilisés pour partager des informations entre des parties du code. Parce que les arguments de la fonction sont transmis par valeur in c, une fonction ne peut pas modifier les variables de ce qui l'appelle. Il existe deux façons de "résoudre" ce problème. La première (et correcte) est de passer un pointeur à la variable dans la fonction. De cette façon, la fonction sait où modifier la variable du parent. Une autre approche consiste simplement à utiliser une variable globale. De cette façon, au lieu de passer autour des pointeurs, ils modifient directement les variables globales directement.

Vous pouvez donc utiliser les deux pour accomplir la même chose, mais comment ils travaillent sont assez séparés. En fait, une variable globale peut être un pointeur.


2 commentaires

Pourquoi (ou dans quelles circonstances) passe-t-il plus "correct" que d'utiliser une variable globale?


Si les informations n'ont pas besoin d'être globales, vous polluez simplement l'espace de noms global. Il peut devenir beaucoup plus difficile de comprendre votre code, car les modifications apportées à l'État mondial peuvent venir de n'importe où. Dans un programme multithreadé, une fonction qui modifie l'état n'était pas ré-entrante ou récursive s'il utilise des globaux ou des variables statiques sans grand soin et / ou serrures.



1
votes

Le terme pointeur fait référence à un type de variable; C'est une variable utilisée pour se référer à une autre. Le terme global fait référence à une portée de variables - c'est-à-dire sa visibilité de toute partie d'un programme. Par conséquent, la question est quelque peu absurde puisqu'elles font référence à différents types d'attribut variable; Une variable de pointeur peut en effet avoir une portée globale, et donc les deux attributs simultanément.

tandis qu'un pointeur peut en effet faire référence à un objet qui n'est pas directement dans la portée (ce qui est ce que je pense que vous faites référence à), il permet toujours un contrôle restreint de la portée, car le pointeur lui-même a une portée (sauf si bien sûr un pointeur global!).

De plus une variable globale toujours a une classe de stockage statique. Alors qu'un pointeur peut faire référence à une variable statique, dynamique ou automatique, et car il s'agit d'une variable, le pointeur lui-même peut être statique ou automatique, ou dans le cas d'une gamme allouée de manière dynamique de pointeurs - dynamique également.

Je pense que vous envisagez peut-être que vous envisagez uniquement d'une utilisation très spécifique des pointeurs lorsque elles ont en fait une utilité beaucoup plus grande et peuvent être utilisées de nombreuses manières. Par exemple, vous utilisez presque invariablement des pointeurs pour mettre en œuvre les liens dans une structure de données de liste liée; Une variable globale ne vous aidera pas à le faire.

clifford


0 commentaires