sirven que punteros puntero parametros para los funciones estructura ejemplo dev datos como cadenas aritmetica apuntadores c pointers

parametros - Por favor explique la ambigüedad en los punteros en C?



punteros como parametros de funciones en c (4)

Debido a que el tipo de *x es ''puntero a la matriz de 5 pulgadas''. Entonces, necesitas una referencia más para obtener el primer elemento

PD:

#include <typeinfo> #include <iostream> typedef int arr[5]; // can''t compile if put arr[4] here void foo(arr& x) { } int main() { int x[3][5]={{1,2,10,4,5},{6,7,1,9,10},{11,12,13,14,15}}; std::cout << typeid(*x).name() << std::endl;// output: int [5] foo(x[0]); return 0; }

#include<stdio.h> main() { int x[3][5]={{1,2,10,4,5},{6,7,1,9,10},{11,12,13,14,15}}; printf("%d/n",x); printf("%d/n",*x); }

Aquí la primera impresión imprimirá la dirección del primer elemento. Entonces, ¿por qué no la segunda impresión imprime el valor en la dirección x, es decir, el primer valor? Para imprimir el valor necesito escribir ** x.


Las matrices, cuando se usan como argumentos para funciones, se descomponen en punteros al primer elemento de la matriz. Dicho esto, el tipo de objeto en el que x decae es un puntero a la primera sub-matriz, que es un puntero a una matriz de int , o básicamente int (*)[5] . Cuando llama a printf("%d/n",*x) , no está alimentando un valor entero a printf , sino un puntero a la primera sub-matriz de x . Dado que esa sub-matriz también se descompondrá en un puntero al elemento de la primera sub-matriz, puede hacer **x para desreferir ese puntero subsiguiente y obtener el primer elemento de la primera sub-matriz de x . Esto es efectivamente lo mismo que *x[0] , que por precedencia del operador se indexará en la primera sub-matriz de x , y luego eliminará la referencia al elemento de la primera sub-matriz en la que la primera sub-matriz se descompondrá.


Para los punteros, x[0] es lo mismo que *x . De esto se deduce que *x[0] es lo mismo que **x .

En *x[0] :

x es un int[3][5] , que se convierte a int(*)[5] cuando se usa en la expresión. Entonces x [0] es un valor de tipo int[5] (la primera "fila" de 5 elementos), que se convierte una vez más en int* , y se hace referencia a su primer elemento.

*x se evalúa siguiendo las mismas líneas, excepto que la primera falta de referencia se realiza con un asterisco (en oposición a la indexación), y no hay una segunda referencia, por lo que terminamos con un valor de tipo int[5] , que se pasa a printf Como puntero a su primer elemento.


Piense en una matriz bidimensional como una matriz de punteros, con cada elemento de la matriz apuntando al primer elemento de otra matriz. Cuando elimina la referencia a x , obtiene el valor que se encuentra en la ubicación de memoria señalada por x ... un puntero al primer int en una matriz de int s. Cuando elimines la referencia de ese puntero, obtendrás el primer elemento.