Dos puntero de cadena, mágico

En C, manejo de cadenas es bastante complejo, no se puede asignar directamente, a menos que el personaje es un puntero a la asignación directa. CADENA suele ser una matriz de caracteres, que dicho array de caracteres tiene que usar strcpy () puede ser asignada.

Por lo tanto, cuando el procesamiento de cadenas de caracteres, a menudo se encuentran dos punteros. Resumir vamos a lo que han aprendido:

1. La matriz de caracteres y caracteres puntero

El conjunto de caracteres asignados a un puntero de carácter, puede dirigir la asignación, no hay necesidad de agregar la dirección a la ruptura antes y arreglo de caracteres.

2. Asignación a la matriz de caracteres

No se puede utilizar directamente el símbolo de asignación '=' pero la función, con strcpy ().

3. puntero a punteros a carácter

char ** char_pointer = & cell_content_char; Este es un puntero de dos caracteres al primer puntero de dirección;

Y el carácter * char_pointer es apuntado por el valor de la dirección almacenada, y este personaje es una asignación matriz de punteros carácter viene. Por lo tanto cell_content_char, valor char_pointer cell_content, * es el mismo.

4. La asignación de puntero a dos

(* (* Char_pointer)) = null; Este es el valor asignado al puntero carácter nulo char_point almacenado en la primera dirección, es decir, la primera cell_content_char carácter sustituido con nula y la cell_content.

La producción en "Le debo" -> "y le deben"

El incremento del puntero

(* Char_pointer) ++; este puntero se mueve hacia atrás una, es decir, el original es el primer punto de la cadena, es decir, la posición del carácter 'i' se mueve ahora hacia atrás uno, el 'lugar se encuentra. Tenga en cuenta que este cambio de puntero, el cambio es cell_content_char, debido a * (char_pointer) se dirige cell_content_char, dos conocidos de la variable puntero de dirección.

-> Nota y (* (* char_pointer)) ++ distinción! Esta operación no tiene sentido.

A continuación, la asignación de dos y un puntero, entonces el momento de sustituir el carácter 'y' está en la segunda posición original'.

Por lo tanto, el valor se convierte en cell_content_char 'yowe', que es * Valor (char_pointer).

Y, el valor de cell_content, se cambia el segundo bit, el resto de la dirección guardada carácter no ha cambiado.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define cell_lenght 10

int main(void)
{

	char null = 'y';
	char cell_content[cell_lenght]; //字符数组
	char *cell_content_char = cell_content;//字符数组赋值给字符指针
	char **char_pointer = &cell_content_char;
	//cell_content_char = "i love";
	printf("default value.\n");
	strcpy(cell_content, "i owe");
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);
	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer);
								// char_pointer是指向cell_content_char的指针,保存的是其首地址。
								// *char_pointer      是cell_content_char字符串的值
						
	printf("starting 1st eval test.\n");
	(*(*char_pointer)) = null;  //替换cell_content_char字符串的首字符

	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer);
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);

	printf("starting 2nd eval test.\n");
	(*char_pointer)++;         //将cell_content_char指针移到下一位,(*char_pointer)指的是cell_content_char字符指针和cell_content字符串数组,
								//即指向了cell_content字符串数组"i owe"的第二位 space
	(*(*char_pointer)) = null; //替换cell_content字符串数组第二位空格为null
								//由于指针移到第二位了,所以*char_pointer和cell_content_char的首地址为第二位。
								//cell_content第一位不变,而是第二位插入了null
	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer); 
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);

	return 0;
}

Imprimir Resultados:

valor por defecto.
cell_content_char = i debo, add = 008FF70C.
cell_content = i debo, add = 008FF70C.
* = i char_pointer debo, add = 008FF70C.
a partir del 1 de prueba eval.
* char_pointer = y debe, add = 008FF70C.
cell_content_char = y debe, add = 008FF70C.
cell_content = y debe, add = 008FF70C.
a partir del 2 de prueba eval.
* = char_pointer yowe, add = 008FF70D.
cell_content_char = yowe, add = 008FF70D.
cell_content = yyowe, añadir = 008FF70C.
poner fin a la prueba.

Publicado cuatro artículos originales · ganado elogios 0 · Vistas 60

Supongo que te gusta

Origin blog.csdn.net/IPGsoz/article/details/104885020
Recomendado
Clasificación