Punteros en c

Punteros en c

El puntero es un concepto muy importante en el lenguaje C porque el puntero nos da el concepto de dirección en la memoria. Todo lo que los demás no accesible, el puntero puede acceder a esto muy fácilmente con la ayuda de la dirección.

Aquí discutiremos el concepto básico de puntero.

Objetivo:

El objetivo principal del puntero es principalmente:

  1. Concepto extendido de puntero
  2. Aritmética del puntero

Concepto extendido de puntero:

X pag Q riñonal
1000 2000 3000 4000

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#incluir
Vacío principal ()

Int x = 5, *p, ** q, *** r;
p = & x;
q = & p;
r = & q;
** q = 7;
*** r = 7;

Explicación:

Aquí P es un puntero. De la línea p = & x, es comprensión que P es un puntero que contiene la dirección de x .

** Q es también un tipo de puntero cuyo nivel de indirección es 2 y R también es un puntero cuyo nivel de indirección es 3. ¿Cuántos * hay que es el nivel de ese puntero??

La regla es que el nivel de puntero es tal que contiene la dirección de otra variable cuyo nivel de indirección es exactamente uno menos de ese puntero.

Para esto Q contiene la dirección de P. P contiene la dirección de x.

El procedimiento de leer la línea int x = 5,*p, ** q, *** r;

x es un int. P es un puntero a un int. Q es un puntero a apointer a un int. Cuántos hay? Decimos exactamente el mismo no de palabra de palabras. Al igual que ** r, significa que R es un puntero, para un puntero, a un puntero a un int.

Si ponemos algún valor con la ayuda de Q, escribimos

1
*q = p, *r = q, *p = x;

Si escribimos un puntero o * antes de una variable de puntero, se convierte en una variable de este tipo que apunta a la media variable, P Block.

Puntos aritméticos:

No podemos agregar multiplicar o dividir en dos direcciones (la resta es posible).

No podemos multiplicar un entero a una dirección. Del mismo modo, no podemos dividir una dirección con un valor entero.

Programación Ejemplo 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dieciséis
17
18
19
20
21
#incluir
vacío principal ()

int a, b;
int *p, *q;
p = & a;
q = & b;
printf (" %d", p + q);
printf (" %d", p * q);
printf (" %d", p / q);

Producción:

Explicación:

En el programa mencionado anteriormente, estamos tratando de agregar, multiplicar y dividir las dos direcciones escribiendo algunas declaraciones.

1
2
3
4
5
printf (" %d", p + q);
printf (" %d", p * q);
printf (" %d", p / q);

Pero no es posible como puede ver desde la salida. El puntero nunca da permiso para agregar, multiplicar y dividir alguna dirección.

El puntero puede permitir algún cálculo matemático. Se mencionan a continuación:

1
2
3
4
5
6
7
P = 1000
P + 1 = 1002
P + 4 = 1008
P - 1 = 998

P es el titero de tipo entero 1000 que se basa en la dirección de un. La variable "A" tiene dos bytes. La dirección de 1er byte es 1001 y la dirección de 2nd byte es 1002. Si agregamos 1 a un puntero, hace la dirección del siguiente bloque o la siguiente variable en lugar de la dirección del siguiente byte.

1
2
3
4
5
Puntero + n = puntero + tamaño de (tipo de puntero) * n
= 1000 + 2 * 1
= 1002

Podemos restar dos direcciones del mismo tipo. El puntero lo permite.

Programación Ejemplo 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#incluir
vacío principal ()

int a, b;
int *p, *q;
p = & a;
q = & b;
printf (" %d", p - q);

Producción:

Explicación:

Aquí, estamos tratando de restar dos direcciones. Afortunadamente, puede soportar el puntero. No se resta literalmente. Está compuesto por un bloque dependiendo de su tipo de datos.

Fórmula

1
Pointer 1 - Pointer 2 = (resta) / tamaño de (tipo de puntero)

Si es tipo char, dividido por 4.

Si es tipo flotante, dividido por 4.

Si es un tipo int, dividido por 2.

Programación Ejemplo 3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
24
25
26
27
28
#incluir
Swap void (int *, int *);
int main ()

int a, b;
printf ("Ingrese dos números");
scanf ("%d%d", & a, & b);
intercambio (& a, & b);
printf ("a = %d b = %d", a, b);

Swap void (int *x, int *y)

int t;
t = *x;
*x = *y;
*y = t;

Producción:

Explicación:

Aquí, un puntero puede pasar por una función. Esto se llama llamada por referencias. Si queremos intercambiar dos enteros pasando los valores de dos enteros a través de una función, no es posible.

Debemos pasar la dirección de la variable t = & x. Si agregamos * a una variable de puntero, entonces * x se convirtió en dicha variable que contiene el valor de la variable, que señala la variable P. Significa t = *x, significa que t contiene el valor de un indirecto.

Llamada por referencias:

Llamar por referencias es la misma que la llamada por dirección. Cuando los argumentos formales son variables de puntero, se llama por referencias.

Dirección de medios de referencia. Llamar por referencia medios, cuando llamamos a una función, pasamos las direcciones de las variables, se llama llamada de referencia.

Puede surgir una pregunta importante relacionada con la dirección o por qué utilizamos la dirección de (&) en scanf ()?

Scanf () es una función predefinida en el lenguaje C. Main () también es una función en el lenguaje C. Usamos scanf () dentro de main (). Entonces, si declaramos dos variables dentro de la función Main (), accedemos a esta variable en scanf (). No podemos usar variables de una función para otra función. Entonces, la función scanf () quiere poner algún valor a una variable y una variable B, entonces debe saber la dirección de A y B.

Para esta dirección de (&) se usa en scanf ().

Conclusión:

Podemos saber todo el concepto básico de puntero. De esta discusión hemos llegado a esta conclusión de que sin puntero no podemos visualizar la gestión de la memoria en el lenguaje C. La dirección controla todo el esquema de gestión de memoria. Para esto debemos conocer el concepto de puntero.