No entiendo lo que es un puntero en la for bucle. ¿Qué hace el *p hacer en el siguiente ciclo?

char str[128] = "Some Text";
char *p;

for (p = str; *p /*what does this mean?*/; p++)
{
    //Code
}

Entiendo que el resto, pero ¿por qué no *p como p > 3 o algo por el estilo?

¿Por qué es único?

¿Por qué está escrito de esa manera?

  • google por «c cadena».
  • en realidad c string terminator como palabra clave de búsqueda es más útil.
  • Feo código. Travieso maestro.
  • La comparación ha sido omitido. Es *p != 0. 0 es el valor que tu char puntero que señala a cuando los extremos de una cuerda, porque es el terminador de cadena. Consulte esta pregunta para obtener más detalles, en particular si se utiliza 0 o '\0'.
  • *p se comporta de igual manera a *p != 0 en este caso como for sólo se preocupa si el valor es distinto de cero (es decir, no es un puntero NULO).
  • *p o *p != 0 elimina referencias p… así que no es la comprobación de un puntero NULO, pero si señala un valor de cero.
  • Sí, debería haber sido «resp.» en lugar de «yo. e.»
  • Yo sé. Se comporta igual. Es por eso que me dijo el de la comparación «se ha omitido». Y no, no es la comprobación de un puntero NULO en todo.
  • tener X como la segunda condición es equivalente a (X) != 0, para todos los X.
  • *p en este contexto en el bucle de medios: por favor, hazlo hasta que el puntero se nil, como la cadena se cierra por \0, obviamente, el bucle termina cuando el ciclo llega el final de la cadena.
  • Es esta recompensa sólo para la creatividad o necesitas alguna información adicional? @Ike
  • Me sorprendería si podría aportar nueva información! Estoy juzgando a los bonos de la menor al valor educativo de la respuesta, son superficiales desafíos que intentar evitar respuestas no sean demasiado simple o rápido (y también espero que un poco de diversión para leer/escribir — C etiqueta se ha vuelto un poco aburrido últimamente). Si usted cree que puede aportar nueva información (por ejemplo: asamblea de ruptura tal vez, compilador de la perspectiva del diseño, la historia, la nada?) Yo estaría muy impresionado por decir lo menos.
  • OK. En LO que me entre perezoso chicos, pero se tratará de añadir la información adicional con un poco de creatividad 🙂 @Ike
  • Estoy sorprendido de que son la concesión de recompensas, y el cambio de las condiciones, antes de que el periodo es cerrado.
  • Se sentía aburrido y generoso con la temporada de vacaciones. :-D, Pero incluso con este tipo de pregunta básica, las diversas características de las respuestas que me sorprende bastante. Por lo tanto las recompensas para sorprender con cada nueva recompensa. Quería, como un experimento, para ver si podíamos conseguir interesantes respuestas de una pregunta básica con un par de obligado restricciones que requieren que la gente se tome algún tiempo en contestar.
  • que es generosa, pero no parecía darse cuenta de mi respuesta ;( sé que Kaiku, que generalmente no rima, pero no acabo de divorcio a mí mismo de limerick habilidades.
  • Yo lo hice! … Y votado. Aunque te perdiste el tiempo por un poco, pido disculpas por eso! Pero me quedo con esta última abierto para ampliar la duración (que se ejecuta fuera de la rep), ojala que va a ayudar a más personas a la notificación de la multa respuesta.
  • gracias pero — ¡vaya! «Kaiku» — que me bajar aunque rime con «Haiku», pero no se supone que.

InformationsquelleAutor MeChris | 2015-11-20

14 Comentarios

  1. 53

    En un contexto Booleano, como la condición de un for bucle, cada expresión en C se evalúa a verdadero (distinto de cero) o false (cero).

    Desea que el for bucle, cuando se llega al final de la cadena.

    En C, cada cadena se termina con el carácter '\0', que es prácticamente 0. Así, cuando el for loop llega al final de la cadena, *p evalúa a '\0', que es 0, en el que se evalúa a false, lo que termina la for bucle.

    • Muchas gracias! Explica muy muy bien. Yo estaba muy confundido porque puntero estaba solo allí.
    • Tenga en cuenta que, por definición, una cadena es una secuencia de cero o más bytes nulos terminada por un byte nulo.
    • Por favor, tenga en cuenta que hay un 100-rep recompensa en esta pregunta.
    • Nota no hay nada que se evalúan a falsas con respecto a un bucle for. Eche un vistazo en mi respuesta, la norma simplemente dice la 2ª expresión tiene que ser de tipo escalar y se interrumpe la iteración cuando su valor evaluado es cero. así que incluso si el uso de stdbool.h, es falso lo que se evalúa de 0 a interupt no viceversa 😉
  2. 31

    El bucle terminará si lo que se encuentra entre los dos ; en la declaración es cero (falso). *p elimina referencias a p y devuelve el char, p puntos. De acuerdo a Dennis Ritchie «C trata de cadenas como matrices de caracteres convencionalmente terminada por un marcador de». Ese marcador es el carácter nulo con (ASCII) valor de cero. Así, este bucle for :

    for (p = str; *p; p++)

    es equivalente a estos

    for (p = str; *p != '
    for (p = str; *p != '\0'; p++)
    for (p = str; *p != 0; p++)
    for (p = str; p[0] != '\0'; p++)
    '
    ; p++) for (p = str; *p != 0; p++) for (p = str; p[0] != '
    for (p = str; *p != '\0'; p++)
    for (p = str; *p != 0; p++)
    for (p = str; p[0] != '\0'; p++)
    '
    ; p++)

    Otro nombre para el carácter de terminación null es centinela o según Donald Knuth «valor ficticio» (el Arte de la Programación de ordenadores, Volumen 1). Aquí está un diagrama de la str cadena, los índices (desplazamientos desde el inicio) de cada personaje y los valores de cada índice :

    Para el bucle con el puntero en C

    Para la integridad y después de una petición en los comentarios de aquí es lo que el depurador se ve en el bloque de memoria que str ocupa :

    0x00007fffffffe6a0:
      0x53 0x6f 0x6d 0x65 0x20 0x54 0x65 0x78 0x74 0x00 0x00 0x00 0x00 0x00 0x00 0x00
         S    o    m    e         T    e    x    t
    1. El valor hex de la primera línea es la dirección (64 bits) de este bloque de memoria. Que es donde p puntos en el inicio del bucle for.
    2. En la 2ª línea que usted vea los valores hexadecimales de las letras en una cadena. Usted puede ver una tabla ASCII aquí. La última char en su cadena de t con el valor hexadecimal de 0x74. Después de que usted tiene la cadena del carácter nulo 0x00. A continuación, puede ver unos cuantos más caracteres nulos debido a que he construido en modo de depuración y el compilador inicializados a cero. Normalmente se puede ver la basura (aparentemente aleatoria de valores)
    3. En la línea 3 he añadido los caracteres de la cadena para la referencia

    Entiendo que usted está en la empinada curva de aprendizaje en el momento con los punteros en C, pero a la larga va a ser capaz de decir «I C a el punto»

    • Esta respuesta tiene un gran potencial, pero siento que le falta una imagen, una cita de Knuth, uno de Ritchie, y uno de sí mismo (en cursiva). Que definitivamente sería obtener mi recompensa, ya que usted ya tiene un lugar fresco sombrero.
    • *p != NULL no es equivalente a la de los demás. NULL puede ser definido como (void *)0, lo que significa que esta es una comparación entre integer y puntero. Esta comparación requiere una conversión a menos que el entero es un puntero nulo constante , que *p no (incluso si le sucede a mantener el valor de 0). Ver C11 6.5.9/2 para referencia (versiones anteriores de C tiene una regla similar).
    • El diagrama de texto *p = NULL es incorrecto; esto debe ser *p = 0 o *p = '\0'
    • Estás en lo correcto. Yo erróneamente que recuerdo haber visto es utilizado como este, pero en realidad era NUL (no estándar).
    • Este post en realidad parece ser la respuesta perfecta. Estoy obligado a esperar un poco de tiempo antes de que yo pueda premio de la recompensa, pero está tan cerca de la perfección! La única cosa que falta es personal y original de la cita de uno mismo — algunos one-liner, quizás, que captura su filosofía sobre este tema y se destaca (podría ser poético y sólo acerca de la programación en general o de la vida de un programador ni nada de eso, o podría ser de unos C, acerca de los punteros en general, acerca de las expresiones, etc.).
    • no es bueno con la poesía o la filosofía tengo miedo 🙁 me hizo agregar un juego de palabras, aunque.
    • Que es perfecto! Ahora sólo tengo que esperar 11 horas, pero esta respuesta es, por lejos, mi favoritest uno.
    • muchas gracias!
    • He subido el «antes», aunque. Ahora hay un total de 100 puntos de recompensa en este P.
    • sería aún mejor si ManisNikolaidis habría que añadir una tercera línea con un volcado hexadecimal, para ilustrar cómo los personajes están codificados en la memoria y cómo un carácter nulo, escrito '\0' y se codifican como 00 termina la cadena.

  3. 19

    Esto podría ser reescrito como este

    for (p = str; *p != '
    for (p = str; *p != '\0'; p++)
    {
    //Code
    }
    '
    ; p++) { //Code }

    En C, una cadena que debe ser siempre termina en un carácter nulo, que es el mismo como el ‘\0’ o 0.

    • Mientras mi recompensa es alentador preguntas muy detalladas con los títulos y cosas así que se puede educar a una amplia gama de personas y también darles más cosas a mirar hacia arriba, esta respuesta es bastante agradable… corto y dulce, y es de destacar en su concisión. Mi única queja es que puede ser prestado de manera bastante rápida. Pero es una maravillosa respuesta, sin embargo — ¡bravo!
    • Wow, muchas gracias. Eso es muy amable de tu parte.
  4. 14

    Antes de la inmersión, me gustaría señalar una regla simple en C con respecto a un la expresión

    Cuando C requiere la valor Booleano de una expresión, un false valor se deduce cuando la expresión se compara igual a cero, y un true valor en caso contrario. Es decir, cada vez que uno escribe

    if(expr)

    donde expr es cualquier expresión en todo, el compilador esencialmente actúa como si hubiera sido escrito como

    if((expr) != 0)  

    Ahora regresando a su pregunta:

    ¿Qué hace el *p hacer en el siguiente ciclo?

    En C, las cadenas de caracteres terminada en un carácter nulo '\0'.

    Para el bucle con el puntero en C

    Cada personaje tiene un equivalente decimal. Este '\0' es un ASCII carácter de escape. El equivalente decimal de '\0' es 0.

    Así, la expresión *p en el bucle acaba de comprobar que el equivalente decimal del carácter en la dirección de memoria apuntada por p es un cero o distinto de cero. Cuando p llega al final de la cadena y se encuentra en la primera '\0' carácter, la expresión *p devuelve1 un valor cero. Un cero significa false en C. Esto es equivalente a la prueba de *p != '\0' o *p != 0 como se indicó anteriormente.

    Así es como funciona:

    Para el bucle con el puntero en C


    1 Cuando *p evalúa el valor de *p se recuperan de la memoria. Este valor es el valor de la expresión *p.

    • OMG, tengo que esperar un par de horas a +1 (agotado mis votos), pero ¿se puede hacer que la animación a ti mismo? Y si es así, cómo???
    • Sí, por supuesto. En realidad estoy con reposo en cama tesis días así que tienes un montón de tiempo. Creado 36 imágenes de este gif 🙂
    • Me siento como tengo que hacer otra recompensa sólo para esta respuesta es, como yo creo que tiene más valor educativo que he visto hasta ahora.
    • Gracias por tu apreciación. Me alegro de que te haya gustado.
    • Tienen todo mi hasta-votos! Me enseñó CS de 101/102 teclas durante un breve período en mi vida (finales de los 90s) así que creo que esta es una de las maneras más eficaces para enseñar a la gente que hay (siempre deseaba podía dibujar animaciones en una pizarra). Esto no encaja en mi actual recompensa solicitudes, pero creo que voy a hacer otra sólo para esto después de que para la mayoría de la respuesta educativa. Siempre he querido hacer más visual respuestas como esta, para explicar temas, pero siempre estaba demasiado perezoso.
    • He hecho una nueva recompensa que se fija a su respuesta. Quiero dejar que el temporizador de ejecución en que uno a dar a todas estas personas que han contribuido respuestas tanto de la exposición como sea posible, pero esta recompensa está reservada para esta respuesta sorprendente para mí tanto con un GIF animado respuesta a la pregunta.
    • Wow! Ahora me siento como que tengo que hacer jessica hablar 😛
    • Por cierto: ¿dónde está tu citar? No se puede encontrar en cualquiera de mis estándar de copys.
    • Es citado de c-faq. Link se adjunta allí.
    • esta animación me mareo xD
    • ¿qué pasa si una real ‘0’ se produce en el medio de la matriz?
    • Luego de bucle se detendrá en que 0.

  5. 13

    Permite analizar el seco, pero la profundidad de camino!

    O como D. Ritchie diría: Vamos a hacerlo con el poder de la asamblea de la lengua y de la conveniencia de … el lenguaje ensamblador.


    Voy a tratar de explicar todos los aspectos necesarios por la referencia a la norma ISO/IEC:9899 (el énfasis es mío)- estándar C99.
    (El post es de estilo motivado por Donald Knuth la frase de «la Ciencia es lo que podemos entender lo suficientemente bien para explicar a un ordenador. El arte es todo lo que hacemos. «)

    En primer lugar, permite inspeccionar ¿qué es exactamente el for-bucle supone que debe hacer!

    Referencia a la norma ISO/IEC:9899 6.8.5 «de la Iteración declaraciones»

    Semántica

    4 Una iteración instrucción hace una declaración llamado el cuerpo del bucle se ejecuta repetidamente hasta el control de la expresión compara igual a 0.

    Hasta ahora nada nuevo supongo, por lo que permite obtener en:

    6.8.5.3 cómo La instrucción for

    1 de La declaración
    for ( clause-1 ; expression-2 ; expression-3 ) statement

    se comporta de la siguiente manera: La expresión expresión-2 es el control de la expresión que es evaluado antes de cada ejecución del cuerpo del bucle. …

    Así, ahora sabemos que el cuerpo (en su caso //Code) será ejecutado siempre el de antemano el valor evaluado de su *p no es cero.

    … La expresión expresión-3 se evalúa como un vacío de expresión después de cada ejecución del cuerpo del bucle.[…]

    Por lo que ahora sabemos, (supongo excavación p++‘s definición no es necesario?!) que para cada iteración p incrementos, por lo que hay un cambio en *p.

    El siguiente punto no está relacionado con el, pero estoy agregando ya que esto hace que la parte Semántica de for completo y de su bien saber ya que es la razón, ¿por qué for(;;) es un inf-loop.

    2 (—) Tanto cláusula-1 y la expresión-3 puede ser omitido. Un omitido la expresión-2 se sustituye por una constante distinto de cero.

    Ok, ese es el seco, pero la información enriquecido parte de lo que el for bucle en su caso.

    Ahora le permite llegar más a la aritmética de punteros:

    6.5.6 operadores Aditivos

    Restricciones

    2 De adición, de cualquiera de los dos operandos se han aritmética tipo, o un operando debe ser un puntero a un objeto el tipo y la otra será de tipo entero. (Incremento es equivalente a la adición de 1.)

    Así en el caso de que usted está agregando 1 (entero) para el «puntero a un objeto»de tipo.

    Lo que es equivalente al incremento de la Dirección por el tamaño de su puntiagudo para escribir como se muestra en esta imagen de tomislav kostic:

    Para el bucle con el puntero en C

    Ahora vamos a ver lo que *p realmente.

    6.5.3.2 Dirección y direccionamiento indirecto de operadores

    Restricciones

    […]

    2 el operando de La unario * operador debe tener tipo de puntero.

    Semántica

    […]

    4 unario * operador indica el direccionamiento indirecto. Si el operando de puntos de función, el resultado es una función de designación; si que apunta a un objeto, el resultado es un lvalue designar el objeto. Si el operando es de tipo «puntero a tipo», el resultado es de tipo «tipo». Si un valor no válido, se ha asignado el puntero, el comportamiento de la unario * operador no está definido.

    Esto es un poco seco de nuevo1 pero para una mejor comprensión de esto puede ser ingeniería inversa por:

    6.5.2.1 Matriz de suscripción

    […]

    Semántica

    2 postfix expresión seguida de una expresión en corchetes [] es un subíndice designación de un elemento de un array de objetos. La definición del operador de subíndice [] es que E1[E2] es idéntica a la (*((E1)+(E2))).

    Así *((p)+(0)) lo que es(desde p+0 es la misma que la p… obvio) es igual a p[0], es no hacer nada más como la evaluación de p‘s objeto.

    Y como sabemos, expression-2 de un bucle for es la interrupción de la iteración que se está evaluando 0, se puede decir que es el mismo que p[0] != 0.

    Ahora el paso final

    Permite buscar en el C-Coder Amigo; JSSCA… No, espera…nuestro amigo se llama… ASCII Ahora como que se aclaró, podemos averiguar cuál es la 0 está representando.

    Es el NULL-token que en C se designa a la final de una cadena.


    De modo concluyente:

    Todos, este es haciendo es:

    Recorrer el cuerpo de que for-bucle, hasta que p es realmente apuntando a la dirección, donde el objeto se evalúa como «el fin de la cadena»-token.

    O:

    Vamos a p ir a través de la cadena hasta llegar al final.


    Y ahora se acaba de citar a mi mismo; Algo que nunca se debe olvidar:

    (el énfasis es mío…..)

    Una variable es declarada mediante una sentencia declarativa(tipo-especificador), que precede el identificador que designa a un lvalue objeto que puede ser evaluado a su valor

    No es ni más ni menos!


    1Que es, lo que me prometió! 😉

    • Esto es increíble! Me siento como un fuerte candidato para la nueva recompensa. Pero me siento un poco como estoy leyendo una respuesta de Spock. Me encantaría ver un poco más de humor, un punto de vista personal sobre el tema, de una filosofía o de una cierta poesía (tal vez un haiku o este tema). Creo Que A Tope De Pez Feo Libro. Realmente siento que esta respuesta tiene un gran potencial para esta nueva recompensa, aunque también podría utilizar algunos de los títulos y/o puntos de bala. Si de alguna manera se puede citar a Jessica Alba, sería tan perfecto (aunque opcional).
    • Si usted mira la respuesta anterior que ganó el anterior recompensa, había un «me C el punto de» broma en la que realmente sesgada de mí hacia ella. Pero no tiene que ser humorístico, podría ser filosófico, sólo una rápida historia personal acerca de cuando se comenzó a aprender C, algo a ese efecto. – cualquier cosa que le da un toque más humano.. ah, y no olvides grande, en negrita los títulos. Aquellos que realmente se destacan.
    • Sobre el personal de la cita, la cita no tiene que ser tan descarado. Sólo podría haber una nueva línea, en cursiva. Por supuesto ideal sería, "I like cheese!" -- Ike — este tipo de formato, tal vez con una nota a pie de página con <sub> </sub> a continuación se indica que la recompensa hizo usted si usted se siente incómodo citando a ti mismo.
    • Ahora, si usted está teniendo dificultades para imaginar cómo posiblemente ir la milla extra, y citar a Jessica Alba, algunas sugerencias…. piense acerca de cómo ella es muy hermosa, tonos, elegante, firme, alegre, lindo, pequeño, una bailarina… este tipo de características debe ser fácil de atar a C, y por qué es todavía alrededor, a pesar de todas esas otras lenguas.
    • Voy a intentar mi mejor esfuerzo a lo largo del día. Pero yo soy una especie de humor minusválidos así que probablemente voy a tener problemas con eso. Pero tal vez voy a ser capaz de hacer algo fuera de lo hecho en sí. ‘^.^
    • Por ahora he cambiado mi Profilpicture en una piedra diseñado para usted y, por tanto, un perfecto accesorio de cabeza. ¿No es impresionante, de todas formas?:D
    • Oh, wow, definitivamente los puntos de bonificación para el sombrero y el avatar. Creo que este es el candidato más fuerte para la nueva recompensa, por el momento. Mi sugerencia para mejorar un poco es romper el texto un poco en secciones a través de los encabezados. Queremos añadir algún destello de allí, hacer la info pop, ya que de lo contrario la gente puede pasar por alto esta joya.
    • hecho hasta ahora. Y una cita de mi propia es incomming pronto. Buscando algo realmente estoy expresando muy a menudo acerca de C y espero encontrar un highvoted post de mí que contiene a consulte 😛
    • Cómo sacaste tan cómodo navegar su manera alrededor de la norma ISO/IEC documentación? ¿Tienes una versión impresa de todo que usted puede hojear de vez en cuando? Por CIERTO — impresionante edición!
    • lo siento, no estoy muy seguro de que tiene que pregunta. Estás preguntando cómo soy capaz de navegar a mi auto que bien por el documento? (si es así, gracias por el cumplido, si no, podría reformular la pregunta?)
    • Oh, lo siento, me refiero a que he notado en sus respuestas, en general, que parece que tienes la habilidad para citar la norma ISO para muchos temas. Nunca he sido capaz de hacer eso-me llevaría las edades a buscar la sección correspondiente, así que me preguntaba si usted tiene una copia impresa que tipo de navegar a través de tiempo en tiempo, mejorar su conocimiento de que la información pertinente se encuentra en el documento.
    • Permítanos continuar esta discusión en el chat.
    • Y no se la cite a mi mismo 😛
    • OMG, no es un competidor feroz que en realidad embebido una foto de Jessica Alba! Creo que tienen la ventaja cuando se trata de la precisión de la técnica, pero hay algunos de la competencia de elaboración de la cerveza. Tal vez sería de gran ayuda para incrustar una foto de Jessica Alba con el texto a lo largo del lado de ella?
    • Bueno, lo que vamos a hacer es totalmente su decisión. 😉 Me gusta mi carta de juego de azar de ASCII a JSSCA y yo realmente no soy buena en intersocial cosas como humorfully que representa una imagen de algunos una expresión de algo o tal. También recuerde que su realidad redacción sólo da «sesgo» a la Jessica Alba parte ;P
    • Por CIERTO, ¿has leído el Culo Feo Peces Libro? amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298. Es posible que no se adapte a su gusto ya que es un libro sobre C llenos de anécdotas y bromas e historias en todas partes. Pero es un buen ejemplo para mí de cómo algo puede ser divertido y muy educativo y razonablemente precisa de todos a la vez. A partir de esta pequeña recompensa juego estoy jugando, fue originalmente inspirado por el aburrimiento … pero he usado para enseñar ciencias de la computación en la década de 2000. Estoy esperando el resultado de P&Una muestra que incluso la pregunta más básica no tiene que…
    • … requieren de una sencilla rutina respuestas, que incluso a una pregunta básica que se puede abordar temas complejos y territorios de una gran cantidad de personas no son conscientes acerca de si queremos tomar como técnicamente lejos como usted lo hace, o tan divertido como otros tomaron, y la diversión que a veces es un requisito previo, al menos para algunos estudiantes, para ayudarles a aprender los sujetos sin ser aburrido. Hay una gama muy amplia de estilos de aprendizaje por allí-desde visual de matemática a muy técnico y literal-un montón de personas se benefician de diferentes estilos. Y tengo la esperanza de que la variedad en estas respuestas se puede mostrar que para los lectores futuros.
    • Al explicar sobre la aritmética de punteros usted debe considerar el pic para matrices de caracteres. @Zaibis
    • de acuerdo. Voy a ver cuando tengo tiempo para eso.

  6. 9

    La *p Haiku

    Poéticamente, traté de representar la lucha de *p en el bucle:

    Valiente C *p(rogrammers)

    En el bucle de whilederness

    La NUL les detendrá

    Este es un poema haiku, se compone de tres líneas, la primera y la última línea que tiene 5 sílabas, y en el medio de la línea 7. Otro ejemplo por @Samidamaru (un Maestro Poeta de Haiku, ver comentario abajo): Primer p es igual a str, Entonces p se incrementa, Hasta que *p es NULO.


    Un poco de pop

    Para el bucle con el puntero en C

    Hora de Código de embajador, Jessica Alba


    ¿Qué hace el *p hacer en el bucle?

    Siguiente el imaginario consejo de Jessica (que cita D. Knuth (1)),
    vamos a tratar de ver el significado de *p en el bucle for:

    for (p = str; *p; p++)

    A este objetivo primero debemos examinar cómo la operador unario «*» obras en C:
    «El operador unario * es el direccionamiento indirecto o deferencing operador; cuando se aplica a un puntero, es tener acceso al objeto de que el puntero apunta.» (B. Kernighan y D. Ritchie (2))

    Tan *p es simplemente el valor apuntado por p:

    Para el bucle con el puntero en C

    1.1 Una mirada más cercana a la de bucle

    El bucle for se compone de tres instrucciones:

    1. p = str
    2. *p
    3. p++

    En 1. se le asigna el puntero a la matriz str a p. En C las asignaciones siguientes tienen el mismo efecto:

    p = &str[0];
    p = str; 

    «Por definición, el valor de una variable o una expresión de tipo array es la dirección del elemento cero de la matriz» (K & R (2)).
    Por otra parte tenemos que «En la evaluación de a[i], C convierte a *(a+i) inmediatamente. …. de ello se desprende que &a[i] y un+i son idénticos» (K & R (2)). Si ponemos i = 0, obtenemos las anteriores tareas.

    Ahora podemos afirmar que, al principio del bucle for, p puntos para el primer elemento de str.

    1.2 el núcleo de La cuestión

    Vamos a pasar al punto 2., el núcleo de su pregunta. La segunda expresión de los controles de bucle la condición de salida: la instrucción «*p» se evalúa y si es falsa la salida del bucle. Esto significa que «*p» es equivalente a «*p != 0» o en palabras: cuando el valor apuntado por p es cero, la salida.

    Ahora, para entender cuando *p es cero recordemos que la matriz str ha sido inicializada como sigue:

    char str[128] = "Some Text";

    y: «todas las constantes de cadena de contener un carácter de terminación null (\0) como su último personaje» (gnu-manual). Así, la cadena que realmente se almacena en la memoria tiene un \0 al final: «Texto\0».

    En la tercera instrucción, p++, el puntero p se avanza al siguiente elemento de la str de la matriz, por lo tanto, en el 9-ésima iteración *p se convirtió en 0 (o \0, NULL, NULL, ver la respuesta de @Joe) y el bucle termina.

    1.3 Ver para creer

    Una imagen vale más que mil palabras, aquí es una representación gráfica del bucle:

    Para el bucle con el puntero en C

    1.4 Un ejemplo más: el mismo uso de *p en un ejemplo diferente

    En el siguiente fragmento de código *p se utiliza de la misma manera, pero en un bucle while:

    #include <stdio.h>
    int main() {
        char str[128] = "We all scream for ice cream!";
        char *p = str;
        //here we see again the loop exit condition *p == '
    #include <stdio.h>
    int main() {
    char str[128] = "We all scream for ice cream!";
    char *p = str;
    //here we see again the loop exit condition *p == '\0'
    while(*p) {
    printf("%c", *p);
    p++;
    }
    printf("\n");
    }
    '
    while(*p) { printf("%c", *p); p++; } printf("\n"); }

    Puede el for(;*C;)e estar con usted!


    Referencias

    (1) Vol. Yo, Algoritmos Fundamentales, El Artículo 1.1 (1968)

    (2) El Lenguaje De Programación C Pg 94-99

    • No quiero ser pedante, pero primero de todo, no hay tal cosa como una «unidad» operador en C. en particular, no se si se refiere a la muy antigua ANSI C. También me gustaría comprobar su cita a la que fue realmente D. Ritchie, quien dijo/escribió «El operador unario * es el directo o deferencing operador; cuando se aplica a un puntero, es tener acceso al objeto de que el puntero apunta.» Pero la dirección url del vínculo con es simplemente… ni siquiera una dirección url. Bueno, tengo que admitir, sus imágenes y el estilo es bastante entretenido, bien hecho. Pero el contenido en sí es mala citado, incompleta y parcial, incluso incorrecta.
    • Citación en realidad no son link, sólo las citas, pero están equivocados como yo guardado como enlaces. Gracias. La unidad es una errata, gracias de nuevo a punto de salir, debe ser unarios. La cita es a partir de pag 94 de la C Lenguaje de Programación. Si usted piensa que hay algunos otros errores agradezco si puede apuntar a ellos y voy a tratar de corregirlos, tengo que admitir que me he centrado más en el exhortando tan bien hecho y las respuestas correctas están ya aquí.
    • Creo que es en el libro. Pero yo no soy académico suficiente para decir que es importante saber que el autor escribió lo que o si 2 autores escribieron un libro que justo puede tomar uno de ellos y asumir que él era? IDK. Pero de acuerdo a la parte que se centra en: bien hecho 😉
    • OMG, esta es una magnífica respuesta y en realidad tiene un embebido foto de Jessica Alba! Bravo! No sé qué hacer ahora, hay algunas difíciles de competencia entre usted y Zaibis! Me siento igual que tu respuesta es la más adecuada para el nivel inicial de la pregunta, pero Zaibus que ha muerto en la precisión de la técnica. En cualquier caso, pase lo que pase, los dos son ganadores en mis ojos!
    • wow, gracias por el comentario, pero especialmente para este divertido juego. Realmente me divertí responder. He actualizado mi respuesta, espero que te guste aún más.
    • Creo que me estoy inclinando hacia Zaibis respuesta, desde su muy característica inusual-pero yo soy el encadenamiento de una recompensa a la derecha después de que las recompensas factor de diversión y principiantes-nivel de adecuación que tiene su nombre por todas partes.
    • Nueva recompensa que actualmente tiene su nombre por todas partes!
    • Hay un nuevo bono reto con la mayor recompensa que puede dar a su respuesta el uber dominando el borde (a pesar de que ya tiene esto para la mayor parte), es incluir un haiku sobre el tema, 5-7-5 sílabas de forma (no más allá del estricto cumplimiento de las sílabas a las formalidades de Haiku) – sólo con formato de esa manera.
    • Creo que su respuesta (además de Haiku) parte podría ser aún más impresionante si la for(;C;) impresionante broma fue for(;*C;) a ajustar para esta pregunta, a pesar de usted-puntales de cualquier manera. Una cosa que puede ayudar es poner un comentario en el que while bucle de la versión de código, especialmente alrededor de la while(*p) parte.
    • Sí, yo también pensaba acerca de la *C, pero estaba en duda.
    • Voy a empezar a pensar en el Haiku de mi copia de «Goedel, Escher, Bach».
    • Vamos chicos donde están estos haikus: en Primer lugar p es igual a str, Entonces p se incrementa, Hasta que *p es NUL.
    • terence hill, si usted desea usar, voy a aceptar una referencia y pagos semanales a mi cuenta de paypal: [email protected]
    • parece justo …
    • quisiera saber si me pueden unirse a su círculo de Msters!
    • respuesta actualizada con el haiku. Hice mi mejor esfuerzo, pero no estoy seguro acerca de la sílaba (como un no-inglés que fue duro, me di cuenta por primera vez que no tengo idea de cómo sílaba obras en inglés).
    • Perfecto! Yo voy a salir de la recompensa va para este uno un poco ya que está empezando a costar un montón de rep-pero sobre todo por lo que la duda se ve. Creo que sería muy difícil superar esta respuesta, además de que no podía parar de reír durante horas la primera vez que vi el de Jessica Alba pic. 😀
    • gracias, corregido. Sí, que sea ;). Espero que podamos ver más respuestas (el de la chqrlie es realmente fantástico) y más comentarios como el de arriba de Samidamaru.

  7. 4

    Hace mucho tiempo, en un PDP, lejos, muy lejos, los recursos eran escasos, los nombres consiguió corto: i para el índice, p de puntero favor principios de los Jedi programadores.

    Implícito pruebas dijo la verdad en for condición de espacio. Una sola * era todo lo que escribió, confiando p y empujando hasta el final de cadenas.

    Para este día, la utilización de los for(e = s;*e;e++) más familiar y elegante lazo para desafiar a la de C++ imperio y sus secuaces de ctors, dtors y vil de los iteradores. Desnudo de bits y bytes en contra de las plantillas, excepciones y ocultar tipos, sólo los valientes todavía se atreven por C a luchar, y uncast la void *.

    • OMG, yo estoy dando este un voto desde el bando rebelde (pensando que no debería) — como C y C++ developer, pero la apreciación de la C estético mucho de una elegancia minimalista. Este es un interesante estilística ángulo — accesorios para su audaz de la naturaleza.
    • La respuesta a esto es aterrador para mí en términos de su pura (y gran) audacia — siento la necesidad de fundición de protección contra la posibilidad de angry C++ devs. Para aquellos que vean, tenga en cuenta que esto contribuye de una forma totalmente estético único ángulo de la cuestión, que la experiencia nos hace divergen en cuanto a la estética, e incluso a través de la elección de los idiomas que utilizamos. Este es un idiomáticas C estético. Y, al final del día, la única cosa que importa es resultados-mira a Linus Torvalds, que desprecia a C++, y eso no se puede discutir con los magníficos resultados alcanzados, sin embargo.
    • Voy a seguir a través de la oscuridad de C++, vamos a derrotar a las plantillas de C *.
    • Divertido +1 de mí también. Pero recuerde que, incluso esto es una buena idea, recordar que todavía es ASÍ que con su on – y off-topics. Es difícil para mí ver una respuesta real en ella. :/
    • Está enfocado desde una perspectiva estilística de por qué el código puede ser escrito en forma de C, que hace la dirección de la parte de op de la pregunta acerca de por qué está escrito de esa manera. También hay una breve respuesta acerca de la lógica de comportamiento de recorrer hasta el final de la cadena. Un poco de variedad en las respuestas es una buena cosa para los futuros lectores como yo lo veo (redundancia sería terriblemente aburrido y consume mucho tiempo para leer a través de), incluso si sólo puede ser aceptada!
    • No quiero decir nada malo acerca de esto. Pero no se puede negar que este es en el borde de off-topicness. Sólo dijo, para mejorar de alguna manera para que no esté demasiado cerca de este borde más 😉
    • Es peligrosamente cerca, aunque creo que es muy claro que las preguntas que descaradamente convocatoria de la subjetividad son OT, no subjetiva respuestas. Tal vez una manera de ver esto es que esta describe una C estético — abrazar es subjetivo, pero las lenguas y la estética no están divorciados de cada uno de los otros. Abrazar un C++ mentalidad de todo corazón a menudo requiere un poco de no gustarle a algunos de la falta de seguridad en C, por ejemplo, mientras que abraza C de todo corazón a menudo se requiere ver un montón de estos mecanismos en C++ como obstáculos para acercarse a los bits y bytes de la máquina.
    • Eso es cierto, pero eso es exactamente el punto, con o sin título. Porque es algo basado en la opinión (veo que incluso en su primer comentario, reacciones). Y eso es algo de lo que es estrictamente trató de evitarse en la SE. me? editar a tu segundo comentario: el punto es la forma de dar por bount cada vez nuevos aspectos a la OP es una especie de fuera de la alcance. Tan difícil de clasificar. Pero no trate de convencerme de que estoy bien. Acabamos de señalar que para que todos son conscientes y cooperativa puede editar.
    • De acuerdo con él, aunque estoy claro sobre si un subjetiva fuga en una respuesta lo amerite como OT. Creo que la razón POB preguntas son OT es en un intento de desalentar demasiada subjetividad en las respuestas (no para evitar rotundamente con un martillo de hierro, ya que la mayoría de nosotros tiene una gran dificultad para no responder nada, a pesar de que usted podría ser capaz de hacerlo a la perfección!). Pero si una respuesta decide a hacerlo de todos modos, creo que es en una zona gris que pone más en la votación, en lugar de marcar territorio. Oh bien, esto podría ser como una meta del tema! :-D, Pero por ahora, creo que esta respuesta es divertido!

  8. 4

    Toma ventaja del hecho de que el terminador de la cadena (lo que, finalmente, se encontraron con que en el bucle) será una ASCII NUL, que es un cero, que también pasa a evaluar a falso, rechazando así el bucle for.

    Vale la pena señalar la diferencia y similitud entre 0, false, NULL y ASCII NUL. Ver a esta pregunta: ¿Cuál es la diferencia entre NULL, ‘\0’ y 0

    • No hay problema. En realidad no hay mucha diferencia, pero vale la pena señalar aquí, ya que es un pedazo de historia que a la gente venir a través, en particular, con desagradables código como el OP mostró.
    • El uso de *p en un contexto booleano es no buenos código, es un estándar de lenguaje de todos los programadores de C están familiarizados con.
    • Tal vez es un terreno arriesgado sugerir es un mal estilo. Personalmente nunca he usado en este contexto, ya que no estaba seguro de que podía, con la más amplia portabilidad, asumir '\0' == 0. Pero aquellos que saben que, de seguro, o tal vez si que está garantizada por la lengua estándar, puede utilizar muy bien que la taquigrafía justificadamente.
    • Estoy de acuerdo en que es idiomáticas C, pero no estoy de acuerdo que es un buen código. El lenguaje no lo hace más fiable, más fáciles de mantener, más rápido o menos unida. Sin duda debe ser entendido, pero no estoy seguro de que debe ser perpetuada.
    • En general, se considera que el tratamiento de los terminadores como '\0' y NULL como los falsos valores hace que el código más legible. No es sólo idiomáticas C y C++, pero avalado por los autores de lengua en El Lenguaje de Programación C. Además, la «lógica de la verdad» sigue estando presente en los principales idiomas creado después de C, tales como Python, Perl, Ruby, o JavaScript. Mientras que no es razonable a la pregunta de cualquier particular estilo de codificación, dado el volumen de la práctica existente, en este caso la carga de la prueba está en que el interrogador.
    • Por FAVOR, no modifique este. Me refiero a NUL. ASCII NULL, not NULL.

  9. 4

    Me han tratado de satisfacer la recompensa awarder los deseos que se han mencionado en varias ocasiones. Para mantenerlo simple, he restringido mi respuesta a tres secciones de tres líneas cada una, y porque (como El Botones dijo en su Regla De Tres) «Lo que os digo tres veces es verdad» (el tema de esta respuesta).

    Técnica

    La verdad de su for bucle termina cuando la expresión *p evalúa a 0 y esta evaluación se realiza antes de cada iteración del bucle, tenga en cuenta que en C 0 es falso y cualquier otra cosa, es verdad – es un muy definición amplia en otros mundos!

    La variable de puntero p se inicializa una vez, a punto para el inicio de la matriz con p = str, y p se incrementa al final de cada iteración, por lo que *p es el acceso a los sucesivos elementos de la matriz en cada iteración.

    La expresión *p así evaluar a 0 (false) cuando el elemento de la matriz de leer por *p es el 0 o '\0' terminator, que señala el final de un C «cadena», pero usted no puede ver este cero en la inicialización de str porque es suministrado por el compilador automáticamente.

    Lírica

    Expresiones de la verdad

    No son comprendidos por los jóvenes

    Leer Ritchie y Knuth

    Caprichosa

    Jessica Alba es una buena actriz que está muy bien informado, haber tenido en cuenta verdades a partir de la observación del desarrollo de la tecnología informática, como estas citas revelan:

    «Cada cinco años, me siento como una persona completamente diferente.»

    «Todo es acerca de su producto y cómo se realiza. Tampoco funciona, o
    no es así».

    • Así *p está apuntando a los sucesivos elementos de la matriz en cada iteración.: creo que te refieres a decir p, ¿no?
    • He debatido con yo el que uso, me puse *p en esta frase porque *p se refiere al elemento de la matriz de valor, no de su dirección. Complicado frase tal vez? Voy a editar en un minuto.
    • Yup. *p representa los sucesivos elementos de lugar.
    • gracias, he hecho un poco diferente de editar, por lo que sigue siendo mi trabajo 😉
    • +1 Para la Lírica! Bien hecho. Usted puede considerar la posibilidad de entrar en nuestro círculo de Maestro de Poetas de Haiku? Y también me gustaban las citas de mi querida amiga Jessica.
    • Esto es excelente!

  10. 3

    Un haiku:

    WHY   for (p=str; *p;        p++)
    IS    for (p=str; p[0] != 0; p++)
    THINK for (i=0;   str[i];    ++i)

    EDITADO

    Aquí hay algunos detalles adicionales:

    La segunda línea de código del «haiku» es equivalente a la primera línea. El post original se pregunta «¿qué significa esto» en un código comentario. La segunda línea muestra la respuesta por equivalencia. *p significa p[0]. La segunda cláusula en la para bucle se preocupa acerca de si o no p[0] es equivalente a cero.

    La tercera línea de código del «haiku» es una línea de código que puede ser utilizado de manera conceptual: Se puede pensar en el funcionamiento de la línea original como se comporta mucho como la tercera línea debe.

  11. 2

    Para el bucle con el puntero en C

    Como se puede ver en la imagen, for bucle se inicia con *p donde p puntos de la str. En este punto *p ha S.

    Cuando continuamente en un bucle en el for, finalmente llega a str[9] que ha '\0' que significa NULL.

    En este punto la instrucción de una condición *p en for (p = str; *p; p++) es igual a NULL por lo que el código de descanso de la for bucle.

    • -1. Lo sentimos, pero NULL no es el carácter nulo, '\0' es. *p != NULL se fallan en la mayoría de los entornos, porque NULL es el puntero nulo y, como tal, define generalmente como ((void*)0). C++ define NULL como 0, lo que permite una escritura tan confuso horrores como *p != NULL. Que no lo haga.
    • Me refería a NULL es ascii NUL (0) personaje aquí. Lo siento por la confusión mediante la mezcla de NUL carácter y NULL puntero.
  12. 2

    Que es el condición parte del bucle.

    Si esa condición no se cumple, entonces el bucle no se ejecuta nunca más.

    *p elimina las referencias el puntero p y devuelve el carácter señaló en la cadena de str.

    El C-estilo de la cadena de str es terminado por el valor \0.

    El bucle itera a través de cada personaje (utilizando p) hasta que la condición no se cumple.

    En C un valor de 0 o \0 es como el significado defalse, es decir, la condición no se cumple.

    Cualquier otro valor es como el significado de true, es decir, se cumple la condición.

    En resumen, p itera a través de cada personaje en str y se detiene tan pronto como llega a la terminación de cadena de caracteres \0.

    ¿Por qué no usar p en lugar de *p?

    Porque p es un puntero y contiene una dirección. A veces es difícil o incluso que no es posible utilizar la dirección de la aritmética sólo. No es una buena práctica y hace que el código sea difícil de leer.

    *p es la eliminan las referencias puntero y contiene el valor que p puntos. En este caso es fácil de usar los valores que p puntos a, porque sabes que la cadena se termina por una \0. Como una condición (if, while, etc.) *p es equivalente a *p != '\0'.

  13. 1

    En primer lugar usted necesita entender un concepto de puntero, como el nombre lo dice apuntan a algo.
    Puntero contiene la dirección de la variable.

        int var=0;
        int *p;
        int p=&var;

    en este código p es un puntero y printf("%d",p); imprime dirección de la variable var y printf("%d",*p); imprime el valor de la variable var que en este ejemplo es de 0.

    En segundo lugar, usted debe entender cómo las matrices de las obras.Las matrices son una especie de estructura de datos que puede almacenar un tamaño fijo SECUENCIAL colección de elementos del mismo tipo.

            int array[3]={9,8,7};
            printf("%d",array[0]); //prints what is on 1st position,9
            printf("%d",array[1]); //prints what is on 2nd position,8
            printf("%d",array[2]); //prints what is on 3rd position,7

    operador [] son sólo amigable al usuario trabajar con matrices.
    Tres últimas líneas de código puede ser reemplazado con las siguientes líneas(y que va a hacer exactamente el mismo):

            printf("%d",*(array+0)); //prints what is on 1st position,9 
            printf("%d",*(array+1)); //prints what is on 2nd position,8
            printf("%d",*(array+2)); //prints what is on 3rd position,7

    array es puntero al primer elemento de la matriz(contiene la dirección del primer elemento de la matriz), para eliminar la referencia de ella se obtiene el valor del primer elemento, por ejemplo,*array.
    Sabemos que las matrices son seqential lo que significa que array+1 puntos al segundo elemento de la matriz,de manera de eliminar esto se obtiene el valor del segundo elemento, por ejemplo,*(array+1), y así sucesivamente.
    Para el bucle con el puntero en C

    Mismo también especial para cadenas, ya que se array de char, excepto de cadena ‘\0’ (carácter nulo) al final de las cadenas.

        char str[128] = "Some Text";
        char *p;
    
        for (p = str; *p; p++)
        {
            printf("%c",*p);
        }

    Este programa imprime la cadena str.

    p = str //asignar la dirección del primer carácter de la cadena str a p,no podemos no perder la pista del primer carácter en la cadena, por lo que el uso de p no str para recorrer

    *p //esta expresión significa *p!=0 así que esto es cierto hasta llegar al final de la cadena,hay que recordar que ‘0’ en ascii tiene valor entero 48

    p++ //al final del bloque que añadir +1 a p para obtener la dirección de la siguiente char

  14. 0

    Puede explicarse de la siguiente manera :

    for( initialization ; Conditional Expression ; expression3)
    {
        Code here will execute while 2nd Expression(Conditional Expression) is true
        true means non-zero value
        '
    for( initialization ; Conditional Expression ; expression3)
    {
    Code here will execute while 2nd Expression(Conditional Expression) is true
    true means non-zero value
    '\0' is equivelant to 0,so when *p equal '\0' : loop will terminate
    }
    '
    is equivelant to 0,so when *p equal '
    for( initialization ; Conditional Expression ; expression3)
    {
    Code here will execute while 2nd Expression(Conditional Expression) is true
    true means non-zero value
    '\0' is equivelant to 0,so when *p equal '\0' : loop will terminate
    }
    '
    : loop will terminate }
    • absoloutly mal! su descripción de un bucle for es simplemente incorrecto. Es la forma en que se utiliza generalmente. PERO son simplyfing de una manera, que sólo excluye de su mainfeatures y de todos modos el propio texto es débil en lo que respecta a las expresiones que utiliza.
    • machine_1: tenga en mente que este es un principiante absoluto a nivel de discusión (aunque Zaibis’ post puede enseñar incluso los profesionales una cosa o dos). Tendemos a simplificar mucho, como cuando se enseña a un niño acerca de cómo nacen los bebés. Para machine_1, tal vez una buena manera de evitar meterse en problemas con la simplificación es calificar a que esto es lo que el código de la op publicado lógicamente significa desde un punto de vista humano, en este contexto, y no es una técnica de descomposición de cómo un for bucle generalmente funciona.
    • No tengo problemas con simplyfications en general y que incluso podría vivir con la primera expresión beeing llamado de inicialización. pero el 3 de beeing degradado a «incrementar» es simplemente no es correcto!
    • Por cierto, aunque tal vez machine_1 fue específicamente tratando de describir lo que significaba lógicamente por for(p=str; *p; p++), en cuyo caso su respuesta ya no es tan inexacto (describir las cosas en términos de la lógica humana, y sólo para que una pieza de código). Así que mi sugerencia para machine_1 es para editar y hacer que su calificación, que esta es la descripción de lo que hace el código, y no en todos, un general for bucle. Que sería aceptable para usted, ¿no?
    • al menos, no vale la pena el downvote más.

Dejar respuesta

Please enter your comment!
Please enter your name here