2009-12-12 51 views
6

Estoy leyendo The C Book para tratar de obtener una mejor base en C. Si bien creo que en general estoy obteniendo el concepto de punteros, una cosa que se me ocurre es que parece que está generalizando lo que sea que esté apuntando en un mundo variable (por ejemplo, la capacidad de utilizar punteros para devolver los valores de void funciones), que naturalmente conlleva todos los peligros asociados, supongo.¿Cuál es la diferencia entre los punteros y las variables globales en C?

Aparte del hecho de que un puntero hace referencia a una variable o índice específico en una matriz, ¿qué es la diferencia entre un puntero y una variable global?

+1

creo que esta es la primera vez que he visto la frase "El libro C", en referencia a una obra que no sea K & R. –

+0

ambos son completamente diferentes. –

+0

Sí, lo noté después de mirar el enlace antes de comentar. –

Respuesta

17

Son bestias bastante diferentes. Para explicar mejor, permítanme definir ambos.

Punteros:

Una variable contiene alguna pieza de datos. Un puntero es un tipo de datos que se refiere a otra pieza de memoria. Piense en ello como un letrero que dice "Por allí ---->" apuntando a un objeto de algún tipo. Por ejemplo, las cadenas en C son solo un puntero a un carácter, y por convención, usted sabe que hay más caracteres que lo siguen hasta un carácter \0. C utiliza punteros ampliamente, ya que no hay otro mecanismo para el intercambio de información común entre las partes del programa, excepto por ....

variables globales:

en un programa, que tiene variables en cada función. Estos pueden ser los parámetros de la función, y los definidos dentro. Además, tiene lo que se conoce como variables globales. Estas variables almacenan información a la que pueden acceder todas las funciones de un archivo. Esto puede ser útil para pasar cosas como un estado global alrededor o configuración. Por ejemplo, puede tener uno llamado debug que su código comprueba antes de imprimir algunos mensajes, o para almacenar un objeto de estado global, como la puntuación en un videojuego.

Lo que creo que le confunde: Ambos se pueden utilizar para compartir información entre partes del código. Como los argumentos de función se pasan por el valor en C, una función no puede modificar las variables de lo que lo llama. Hay dos maneras de "arreglar" ese problema. La primera (y correcta) forma es pasar un puntero a la variable en la función. De esta forma, la función sabe dónde modificar la variable principal. Otro enfoque es simplemente usar una variable global. De esta forma, en lugar de pasar punteros, simplemente editan las variables globales directamente.

Así que puede usar ambos para lograr lo mismo, pero la forma en que funcionan es bastante separada. De hecho, una variable global puede ser un puntero.

+2

¿Por qué (o en qué circunstancias) está pasando el puntero más 'correcto' que utilizando una variable global? –

+5

Si la información no necesita ser global, solo estás contaminando el espacio de nombres global. Puede ser mucho más difícil comprender su código, ya que los cambios en el estado global pueden provenir de cualquier lugar. En un programa multiproceso, una función que edita el estado no sería reentrante o recursiva si utiliza variables globales o estáticas sin gran cuidado y/o bloqueos. – McPherrinM

0

conceptos completamente diferentes. Puede tener punteros a variables globales y locales. No hay nada que asocie a los dos.

Además, desde una función, sin duda puede devolver un puntero a una variable delimitada dentro de esa función. Pero esa es una mala idea ya que la variable existía en la pila de la función y ahora eso se ha ido.

8

Una variable global es cualquier variable que se puede acceder en cualquier ámbito. Un puntero es una variable que contiene la dirección donde vive algo.

No están directamente relacionados entre sí de ninguna manera.

Una variable de puntero puede estar en un alcance global o local y también puede apuntar a una variable que está en ámbito global, local o nulo (como si procediera del almacenamiento dinámico o direccionamiento de algunas líneas DIO).

4

Hay una gran diferencia. Aparte de los "otros" usos de punteros (que incluyen tratar cadenas y matrices, y construir estructuras dinámicas de datos como árboles y listas enlazadas), usar un puntero para dar acceso a otra función a una variable local es mucho más flexible y controlado que compartir una variable global entre estas dos funciones.

En primer lugar, permite que la función llamada se proporcione acceso a variables diferentes en diferentes momentos. Piense cuánto más laborioso sería usar scanf() si siempre guardaba sus resultados en las mismas variables globales.

En segundo lugar, pasar un puntero a otra función te hace mucho más consciente del hecho de que esa función podrá modificar el objeto. Si usa una variable global para el mismo propósito, es fácil olvidar qué funciones modifican el global y cuáles no.

En tercer lugar, las variables globales consumen memoria durante la vida de su programa. Las variables locales se liberan cuando su función contenedora finaliza, y los datos asignados dinámicamente se liberan cuando es free d. Entonces las variables globales a veces pueden ser una pérdida considerable de memoria.

El uso de punteros conlleva el peligro de hacer referencia a variables que ya no existen, por lo que se debe tener cuidado. Pero esto suele ser un problema cuando existen estructuras de datos complejas o de larga duración que, en sí mismas, a menudo son una debilidad del diseño.

Los Globals se interponen en el camino del buen diseño modular del programa y los punteros a menudo proporcionan una mejor manera de lograr las mismas cosas.

3

"Puntero" es una variable que le indica cómo obtener un valor: es la dirección del valor que le interesa. Lo desreferencia (con *) para obtener el valor.

"Global" define el alcance de la variable: en cualquier parte del programa puede decir el nombre y obtener el valor.

Puede tener punteros locales o indicadores globales no punteros. Los conceptos son completamente ortogonales.

0

El término puntero se refiere al tipo de una variable; es una variable utilizada para referirse a otra. El término global se refiere a un ámbito de variables, es decir, su visibilidad desde cualquier parte de un programa. Por lo tanto, la pregunta no tiene sentido ya que se refieren a diferentes tipos de atributos variables; una variable de puntero puede de hecho tener un alcance global y, por lo tanto, tener ambos atributos simultáneamente.

Mientras que un puntero puede referirse a un objeto que no está directamente dentro del alcance (que es a lo que creo que se refiere), todavía permite un control restringido del alcance, porque el puntero mismo tiene alcance (a menos, por supuesto, es un puntero global!).

Además, una variable global siempre tiene la clase de almacenamiento estático. Mientras que un puntero puede referirse a una variable estática, dinámica o automática, y debido a que es una variable, el puntero mismo puede ser estático o automático, o en el caso de una matriz de punteros dinámicamente asignada, también dinámica.

Creo que tal vez solo está considerando un uso muy específico de los punteros cuando en realidad tienen una utilidad mucho mayor y se pueden usar de muchas maneras. Por ejemplo, casi invariablemente utilizaría punteros para implementar los enlaces en una estructura de datos de lista enlazada; una variable global no te ayudará a hacer eso.

Clifford

Cuestiones relacionadas