1. Puntero de caracteres y matriz de caracteres
Puntero de caracteres
La variable puntero de cadena es en sí misma una variable que se utiliza para almacenar la dirección inicial de la cadena. La cadena en sí se almacena en un bloque de memoria contiguo que tiene esa dirección inicial como comienzo y con\0como terminación de la cadena.
char *ps="C Language";
indica que la primera dimensión almacena 10 elementos y la segunda dimensión almacena 20 elementos, los valores se almacenan en un área de memoria continua, sin punteros.
char *ps; // ps 字符串指针,是指针,是一个变量
ps="C Language"; // ps es la dirección inicial de la cadena; usando ps++ se puede recorrer la cadena. La cadena se almacena en un espacio de memoria contiguo cuya dirección de inicio es ps, y con\0como fin de la cadena.
Aquí hay dos puntos que deben quedar claros:
1. *a solo apunta a un carácter.
Por ejemplo:
Ejemplo
El resultado de la ejecución es el siguiente:
输出字符:b 输出字符:c 输出字符串:bcd
2. Si una constante de cadena aparece en una expresión, el valor que representa es la dirección del primer carácter de dicha constante. Por lo tanto, hello solo representa su dirección. La forma de declaración original equivale a la siguiente forma de declaración:
char *a; a="hello"; /*这里字符串"hello"仅仅代表其第一个字符的地址*/
Matriz de caracteres
Una matriz de caracteres está compuesta por varios elementos de matriz y se puede utilizar para almacenar una cadena completa. (Es decir, usar una matriz de caracteres para almacenar la cadena).
En C, las cadenas se tratan como matrices de caracteres. (En C++ no).
Métodos de inicialización de una matriz de caracteres:
1). Se puede inicializar una matriz de caracteres con una constante de cadena:
char str[]={"Iamhappy"};
Se pueden omitir las llaves.
char str[]="Iamhappy"; # 系统自动加入 \0
Nota: La asignación global de la matriz de caracteres mencionada anteriormente solo se puede usar al inicializar la matriz de caracteres, no se puede usar para la asignación de la matriz de caracteres; la asignación de una matriz de caracteres solo se puede hacer elemento por elemento.
El siguiente método de asignación es incorrecto:
char str[20]; str="Iamhappy";
Asignar valores a cada elemento de la matriz de caracteres uno por uno.
char str[10]={'I','','a','m','','h','a','p','p','y'};
En C, hay dos formas de representar y almacenar cadenas:
(1) Usar una matriz de caracteres para almacenar una cadena
char str[]="IloveChina";
(2) Usar un puntero de caracteres para apuntar a una cadena
char *str="IloveChina";
La salida de cadenas en ambas formas utiliza:printf("%s\n", str);
%srepresenta la salida de una cadena, dado el nombre de la variable puntero de caracteres str (para el primer método, el nombre de la matriz de caracteres es la dirección inicial de la matriz, que tiene el mismo significado que el puntero en el segundo método), el sistema primero muestra el dato de un carácter al que apunta, luego automáticamente incrementa str en 1 para que apunte al siguiente carácter…, y así sucesivamente, hasta encontrar el marcador de fin de cadena.\0 。
2. Puntero de cadena
string* strSe puede asignar:
string* str = {"hello", "world"};
// 对比与 char *name = "wang" = {'w','a','n','g'}
// *(str) = "hello", *(str+1) = "world"
// *(*(str)+1) = 'e'
Es decir, cada elemento es de tipo string, lo cual es diferente de char*; sin embargo, string* puede ser reemplazado por char**:
string = char*, string* = char**
3. Matriz de punteros (a cadenas)
Ejemplo
o
Ejemplo
El resultado es:
Hello,ello,o
Formato:char* na[N] = {"li", "zh", "li", "zh", "li"};
char *a[]: indica que a es una matriz, los elementos de la matriz son punteros que apuntan al tipo char (todos los elementos de la matriz se almacenan en memoria contigua). El nombre de la matriz es la dirección de memoria del primer byte de la matriz, y el nombre de la matriz a también representa un puntero. Por lo tanto, a no representa el contenido almacenado en la dirección de a, sino la dirección de a en sí misma.
a+1: representa la dirección de memoria del segundo elemento de a, por lo que se suman 8 bytes. (Como los elementos de a son punteros char, el espacio necesario es de 8 bytes (dirección de memoria de 64 bits).)
*(a+1): representa el contenido del segundo elemento de la matriz a (es un puntero de tipo char, en este ejemplo representa la dirección de la cadena "world").
*(*(a+1)): representa el contenido al que apunta el contenido del segundo elemento de la matriz a (puntero char) (el carácter w).
char * a[10]: indica que esta matriz puede almacenar como máximo 10 elementos (punteros char), es decir, esta matriz ocupa 10*8 = 80 bytes.
#w: a+1 => *(a+1) => *(a+1)[0]
指针(地址) 指针内容(字符串) 字符
cuatro
char *argv:理解为字符串 char **argv:理解为字符串指针 char *argv[]:字符串指针数组
int main(int argc, char*argv[])Este es un ejemplo típico de un nombre de matriz (o más bien, una matriz de punteros) utilizado como parámetro de función, y además es un parámetro de matriz sin tamaño especificado.
A veces, para satisfacer la necesidad de procesar elementos de la matriz en la función llamada, se puede establecer otro parámetro formal para pasar la cantidad de elementos de la matriz que se deben procesar. Además, cuando se usa el nombre de la matriz como argumento real de la función, no se pasan los valores de los elementos de la matriz al parámetro formal, sino que se pasa la dirección del primer elemento de la matriz del argumento real al parámetro formal de matriz; de esta manera, las dos matrices comparten la misma unidad de memoria. Esto es diferente a usar variables como parámetros de función.
Puedes consultar ejemplos sobre matrices como parámetros de función y matrices de punteros como parámetros formales de la función main. El libro de Tan Haoqiang lo explica con mucho detalle y tiene una explicación detallada al respecto.
1. Cuando char [] se usa como parámetro de función, representa char *. Cuando se pasa como parámetro de función, en realidad se copia la dirección del primer elemento de la matriz.
Así que void test (char a[]) es equivalente a void test ( char * a )
char x[10] ;
Luego, llamar a test(x) equivale a asignar la dirección del primer elemento de x al parámetro a.
2. char * a y char a[]
- Similitud: a es un puntero, que apunta al tipo char.
- Diferencia: char a[] almacena el contenido en la pila (stack). char *a almacena el puntero en la pila (stack) y el contenido en constantes (constants).
3. char * a
- Similitud: a es un puntero de nivel 2, *a representa un puntero de nivel 1, **a representa el contenido almacenado en memoria.
- Diferencia: char * a
4. Truco: la cantidad de [] y * se corresponden; por ejemplo, el número de niveles de puntero de char a[][] es 2, equivalente a char **a; char *a[] también es así, dos niveles de puntero. Cuando estés confundido, cuenta cuántos * y cuántos [] hay, y sabrás en qué casos se almacena contenido o dirección. Por ejemplo, en el caso de char a[][]: &a, a, *a son direcciones, **a es contenido.
Dirección original: https://www.cnblogs.com/cj2014/p/3726380.html