#include <stdio.h>#define MAX 10int main(void){ int *ptrVector[MAX], i; for(i=0; i<MAX; i++){ *(ptrVector + i) = &i; } for(i=0; i<MAX; i++){ printf("%d ", *(ptrVector + i)); } printf("\n\n Pulse una tecla para finalizar..."); getchar(); return 0;}
C:\ProgramasNotepad\Punteros.c: In function 'main':C:\ProgramasNotepad\Punteros.c:13:3: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=] printf("%d ", *(ptrVector + i)); ^
int vector[MAX]; int *ptrVector = &vector[0]; for(int i=0; i<MAX; i++){ *(ptrVector + i) = i*128; } for(int i=0; i<MAX; i++){ printf("%d ", vector[i]); }
C:\ProgramasNotepad\Punteros.c: In function 'main':C:\ProgramasNotepad\Punteros.c:9:20: warning: assignment makes pointer from integer without a cast [enabled by default] *(ptrVector + i) = i+1; ^C:\ProgramasNotepad\Punteros.c:13:3: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=] printf("%d ", *(ptrVector + i)); ^
#include <stdio.h>#define MAX 10int main(void){//Esta declaración es innecesaria.. serviria con declarar un simple array[] de una dimension. //int *ptrVector[MAX], i;//Esta forma es las correcta para este ejemplo. int ptrVector[MAX],i; for(i=0; i<MAX; i++){//Aca, *(ptrVector+i)=[u]&i[/u] , no es del todo correcto para este ejemplo, ya que *(ptrVector+i) espera un valor entero, y [u]&i [/u] le proporciona una dirección de memoria. //*(ptrVector + i) = &i;//Esto seria correcto. *(ptrVector + i) = i; } for(i=0; i<MAX; i++){//Aqui ya no da ningun warning. printf("%d ", *(ptrVector + i)); }
#include <stdio.h>#include<stdlib.h> #include<time.h>#define MAX 10int main(void){ int vector[MAX], *ptrVector = &vector[0], i, hora = time(NULL); srand(hora); for(i=0; i<MAX; i++){ *(ptrVector + i) = rand()% 100; } printf("\n\n"); for(i=0; i<MAX; i++){ printf("%d ", *(ptrVector + i)); } printf("\n\n Pulse una tecla para finalizar..."); getchar(); return 0;}
int *puntero; puntero = (int*) malloc (10);
CPU DisasmAddress Hex dump Command Comments00401453 ³> C70424 0A00000 MOV DWORD PTR SS:[LOCAL.30],0A ; Úsize => 10.0040145A ³. E8 41510100 CALL <JMP.&msvcrt.malloc> ; ÀMSVCRT.malloc0040145F ³. 8945 C0 MOV DWORD PTR SS:[LOCAL.16],EAXEAX= 007510A8
CPU DumpAddress Hex dump ASCII007510A8 0D F0 AD BA|0D F0 AD BA|EE FE AB AB|AB AB AB AB| ðºðºîþ««««««007510B8 AB AB EE FE|EE FE EE FE|00 00 00 00|00 00 00 00| ««îþîþîþ007510C8 7E A0 5B 83|76 86 00 00|A8 37 75 00|F8 0F 75 00| ~ [ƒv† ¨7u øu
for (int i=0;i<10;i++,puntero++) { *puntero=i*128; printf ("valror%d direccion:0x%x \n",*puntero,puntero ); } free (puntero);
CPU DumpAddress Hex dump ASCII007510A8 00 00 00 00|80 00 00 00|00 01 00 00|80 01 00 00| € €007510B8 00 02 00 00|80 02 00 00|00 03 00 00|80 03 00 00| € €007510C8 00 04 00 00|80 04 00 00|A8 37 75 00|F8 0F 75 00| € ¨7u øu
int (*p1d)[10];es la declaración apropiada, es decir p1d es aquí un apuntador a un arreglo de 10 enteros tal y como era comocuando fue declarado usando el tipo de datos Arreglo. Observa que es diferente de hacer:
int *p1d[10];lo que haría de p1d el nombre de un arreglo de 10 apuntadores al tipo entero.