puntero
tipos de puntero
XX Tipo + * → XX tipo de puntero
int * conformación tipo de puntero
char * Char tipo de puntero
variable de puntero
puntero variable es una declaración de puntero tipo de variable
int a; // declara una variable de número entero
int * a; // declarar un puntero a una variable de número entero
asignación variable de puntero
variable de puntero se almacena en la dirección de memoria de un principio de asignación de variable: ¿Qué tipo de variable de puntero, se le debe dar la dirección del valor de la variable del tipo correspondiente:
① int * p = 0x40003a04; // fácil interpretación
② int a; Char b = 'B'; int * p1 = & a; char * p2 = & b;
dirección de memoria
medios de memoria RAM en un lugar determinado, generalmente expresada en números hexadecimales, como 0x40003a04;
En el 32-bit CPU , la dirección es un 32 número entero bits sin signo, puede representar 2 ^ 32 (4 GB) de direcciones.
puntero de la naturaleza
Independientemente del tipo de puntero, la dirección debe ser almacenado, que apunta a la dirección de la variable correspondiente, y el valor de la dirección es un 32 número entero bits sin signo, cualquier tipo de tamaño del puntero es de 4 bytes;
tipo de puntero → unsigned int
tipo de puntero común
tipo |
En t |
carbonizarse |
flotador |
doble |
struct A {int a; int b;} |
func vacío () |
tipos de puntero |
En t* |
carbonizarse* |
flotador* |
doble* |
struct A * |
typedef void (* pFunc) () |
Definir e inicializar el puntero
int * p1 = NULL;
char * p1 = NULL;
flotar * p1 = NULL;
doble * p1 = NULL;
asignación variable de puntero
int a = 5; int * p1 = & a;
Obtener el valor de la variable de puntero hace referencia la variable
Uso * Obtener el valor de la variable de puntero
printf ( “% d”, * p1);
* Los dos usos
Tipo * |
tipos de puntero |
* Variable de puntero |
Recogida del puntero indica el valor de la variable |
Pointer tipo de estructura tipo
tipo |
struct A {int a; int b;} |
tipos de puntero |
struct A * |
variable de puntero definición de la estructura
struct A * p = NULL;
La obtención de la dirección de la variable de estructura
struct A {int a; int b;};
struct A a;
printf ( “% p”, y a);
Uso * estructura de obtener el valor variable de puntero
struct A {int a; b int; };
struct A a = {5, 6};
struct A * p = & a;
printf ( “% d,% d”, (* p) .a, (* p) .b);
El uso de los miembros de la estructura variable de puntero de acceso
Por -> referencia a una estructura de variables miembro
struct A {int a; b int; };
struct A a = {5, 6};
struct A * p = & a;
printf ( “% d,% d”, p-> a, p-> b);
puntero de función: Puntero símbolo * delante del nombre de la función
Función: FUNC void () {printf ( "FUNC \ n");}
Dirección de la función
Para el nombre de la función, que es la primera dirección, la misma dirección para tomar los dos siguientes:
printf ( “% p \ n”, func);
printf ( “% p \ n”, y func);
Función tipo de puntero , sin typedef representa define una variable de puntero de función
prototipo de función |
func vacío () |
tipos de puntero |
typedef void (* pFunc) () |
asignación de puntero de función
pFunc p = func; o pFunc p = & func;
Llame a la función utilizando las variables de puntero de función
pFunc p = func;
p (); // llama func función
puntero de función compleja
int (* (* p) (int)) (int);
p.ej. int typedef (* (* pFunc3) (int)) (int);
pFunc3 FUNC3 = func;
puntero salvaje
Un área de memoria del puntero ilegal
① puntos a la memoria ha sido destruida
② punto no tiene memoria de acceso
①int * p = (int *) malloc (int);
libre (p); // este tiempo p cuando el campo se ha convertido en un puntero, luego tomar el valor de la dirección, la distorsión
② azar p puntos a un área de memoria de desconocido incertidumbre; causarían una memoria para ser modificado, causando sutiles ERROR o de sistema se bloquea
Evitar colgando punteros
① puntero inicializar la aplicación: int * P = NULL ;
② liberado después el puntero de memoria se establece en NULL : libre (P); P = NULL;
Pointer aritmética: adición / sustracción
Además Pointer: Pointer + N : muestra un valor de puntero más N * sizeof ( tipo ) bytes
Que usted le
↑ ↑
int * p p + 3
Además Puntero: ++ puntero: muestra un valor de puntero más sizeof ( tipo ) bytes, después de ejecutar el puntero p cambios de valor
Que usted le
↑ ↑
int * p ++ p
Pointer resta método: puntero -N : muestra un valor de puntero menos el N * sizeof ( tipo ) bytes
Que usted le
↑ ↑
p-3 int * p
Pointer resta método: - Puntero: el puntero indica el valor obtenido restando sizeof ( tipo ) bytes, después de ejecutar el puntero p cambios de valor
Que usted le
↑ ↑
-P int * p
Puntero - Puntero: indica el número de dos bytes obtenidos restando el valor de la dirección: P2 = P1 3-.
Que usted le
↑ ↑
int * * p2 p1 int
One-dimensional array
int a [5] = {1,2,3,4,5 }; ocupa un espacio de memoria contigua, cada valor en la matriz de un byte;
Primera dirección matriz unidimensional es una matriz de nombre o la dirección del primer elemento;
int a [5] = {1,2,3,4,5};
int * p = a;
int * p = & a [0];
La diferencia entre el nombre del puntero y la matriz
tipo |
si la variable |
calculable |
nombre de la matriz |
Inmutable, es una constante |
Incapaz ++ , - |
puntero |
Puede cambiar, es variable |
Puede ++ , - |
Utilizar punteros a elementos de la matriz de acceso
for (int i = 0; i <5; i ++)
{
printf ( “% d \ n”, * (p + i));
}
for (int i = 0; i <5; i ++)
{
printf ( “% d \ n”, * (p ++));
}
for (int i = 0; i <5; i ++)
{
printf ( "% d \ n" , * (a + i)); // nombre de la matriz es una constante, no cambiar, mediante la adición de i valor de desplazamiento, no de la resta
}
matriz bidimensional
int a [2] [3] = {{1,2,3}, {4,5,6}};
a [0] → 1 2 3
a [1] → 4 5 6
Primera dirección matriz bidimensional es una matriz de nombre o la dirección del primer elemento;
Definido puntero matriz bidimensional
Point matriz bidimensional de punteros: puntero de fila → tipo (* p) [N]
int a [2] [3] = {{1,2,3}, {4,5,6}};
int (* p) [3];
p = a; // asignar un nombre de matriz
p = & a [0]; // puntero a la primera dirección del primer elemento
Utilizar punteros de acceso a una matriz bidimensional de elementos
for (int i = 0; i <2; i ++)
for (int j = 0; j <3; j ++)
{Printf ( “% d \ n”, p [i] [j]); }
for (int i = 0; i <2; i ++)
for (int j = 0; j <3; j ++)
{Printf ( "% d \ n ", * (p [i] + j));} // p [i] representante del puntero de fila, el p [i] visto como un nombre de matriz
for (int i = 0; i <2; i ++)
for (int j = 0; j <3; j ++)
{Printf ( “% d \ n”, * (* (p + i) + j)); }
a [m] [n] es indicación equivalente
tipo |
las definiciones de puntero |
asignación |
puntero de fila |
int (* p) [N] |
a & a [N] |
punteros ordinarios |
En t* |
un [N] & a [M] [N] |
Las constantes de cadena es en sí misma una dirección
hola guardará en la memoria hola \ 0
Las constantes de cadena esencia es una sección de la memoria, la primera dirección para identificar, y el valor de las constantes de cadena no se puede cambiar
puntero de cadena
char * p = "Hola"; no utiliza P = [1.] 'A'; cambiar el contenido de
Impartir a la cadena variable de puntero constantes primera dirección;
for (int i = 0; i <5; i ++)
{Printf ( “% c \ n”, p [i]); }
for (int i = 0; i <5; i ++)
{Printf ( “% c \ n”, * (p + i)); }
for (int i = 0; i <5; i ++)
{Printf ( “% c \ n”, * (p ++)); }
puntero puntero
variables de puntero ocupan memoria, también hay una dirección de memoria
tipo de puntero:
XX Tipo * → XX tipo de puntero
XX Tipo * * → XX tipo de puntero // tipo de puntero
int ** // puntero de tipo int punteros
char ** // carácter puntero en forma de un tipo de puntero
flotador ** // tipos de coma flotante puntero a un tipo de puntero
p.ej.
int a = 10;
int * p = & a;
int ** p = & p;
El uso de vacío -parámetros
void * puede pasar cualquier tipo de dirección
func (void * p)
{// el p convierte en el tipo real }
variable de puntero moldeada
int a = 5;
int * p = & a;
int c = (int) p;
int * p2 = (int *) c;
variable de puntero moldeada
Char buf [256]
int * p = (int *) buf;
* P = 123;
printf ( “% d \ n”, * p);
Char buf [256]
struct A {int a; int b;};
A * p = (A *) buf;
p-> a = 12;
p-> b = 34;
printf ( “% d,% d \ n”, p-> a, p-> b);