c - semejanzas - tamaño de virus
Por favor explique la diferencia (4)
Bueno, son cosas diferentes. arr
descompone en la mayoría de los contextos en un puntero al primer elemento de su matriz, lo que significa un puntero a la primera fila de 3 elementos en su matriz 2D: escriba int (*)[3]
. arr + 1
, entonces, apunta a la segunda fila en la matriz.
&arr
es la dirección de la matriz en sí (escriba int (*)[3][3]
), por lo que &arr + 1
puntos &arr + 1
a la memoria justo después del final de la totalidad de su matriz 2D.
Puede confirmar este comportamiento fácilmente imprimiendo de manera diferente. Específicamente, imprimir los desplazamientos a los nuevos punteros en lugar de los valores en sí mismos ayudará a aclarar las cosas. El resultado de su programa a partir de estas declaraciones impresas:
printf("%ld/n",(intptr_t)(&arr+1) - (intptr_t)arr);
printf("%ld/n",(intptr_t)(arr+1) - (intptr_t)arr);
Serán los desplazamientos decimales a &arr+1
y arr+1
respectivamente. Aquí está el resultado de una prueba que acabo de hacer:
36
12
36 coincidencias arriba: 3 filas × 3 columnas × 4 bytes por entrada = 36 bytes. Lo mismo ocurre con la fila 12: 1 × 3 columnas × 4 bytes por entrada = 12 bytes.
Nota: también está imprimiendo punteros usando %d
, lo cual es incorrecto. Probablemente deberías estar usando %p
para eso.
tengo un programa sobre matrices en 2-D
la dirección base es
8678
#include<stdio.h>
#include<conio.h>
main()
{
int arr[3][3]={
{83,8,43},
{73,45,6},
{34,67,9}
};
printf("%d ",&arr+1); //points to 8696
printf("%d ",arr+1); //points to 8684
return 0;
}
¿
arr+1
es la diferencia entrearr+1
y&arr+1
?
Puede resolver esto con la ayuda de esta equivalencia: X [Y] === * (X + Y)
Desde * (arr + 1) === arr [1], arr + 1 === & arr [1]
Del mismo modo, & arr + 1 === & ((& arr) [1])
¿Qué es (y arr) [1]? Bueno, (& arr) [0] === * & arr === arr, es decir, la matriz de 3x3, así que (& arr) [1] es la matriz de 3x3 que sigue a eso, y & arr + 1 === & (( & arr) [1]) es la dirección de la matriz 3x3 que sigue y arr ... un puntero al byte justo después de la matriz completa.
array + 1 significa la dirección de la matriz [1] y cuesta 3 int de memoria.
& array + 1 significa la dirección de array [0] add 1;
Arr + 1 da el siguiente elemento en una matriz, mientras que arr + 1 da la dirección de la siguiente matriz de enteros