Enviado em 12/12/2018 - 09:53h
Pessoal, como eu posso percorrer uma matriz dinamicamente alocada com aritmética de ponteiros?
Desde já Obrigado
Desde já Obrigado
Enviado em 12/12/2018 - 09:53h
Enviado em 12/12/2018 - 20:47h
#include <iostream>
int main()
{
int** matrix = new int*[5];
for (int i = 0; i < 5; ++i)
*(matrix+i) = new int[5];
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
std::cout << *(*(matrix+i)+j) << " ";
}
std::cout << "\n";
}
for (int i = 0; i < 5; ++i)
delete[] *(matrix+i);
delete[] matrix;
return 0;
}
std::cout << *(*(matrix+i)+j) << " ";
std::cout << *(matrix+i+j) << " ";
Enviado em 12/12/2018 - 16:26h
Enviado em 12/12/2018 - 18:44h
id(p){ return p; }
main(){
int v[]={1, 2, 3};
int *a, *b, *c, *d;
a=v+1; /* Aritmética de ponteiro. OK. */
b=id(v)+1; /* Ponteiro se perde. Aritmética com dois inteiros. */
c=id(v+1); /* Aritmética de ponteiros antes da função. Depois o ponteiro se perde. */
d=id(v)+sizeof *v; /* Ponteiro se perde. Valor certo do endereço obtido manualmente. */
printf("%d %d %d %d %d\n", &v[1], a, b, c, d);
printf("%d %d %d %d %d\n", v[1], *a, *b, *c, *d);
} $ ./linuxpc32 ; ./linuxpc64
-3798332 -3798332 -3798335 -3798332 -3798332
2 2 33554432 2 2
-755092352 -755092352 -755092355 -755092352 -755092352
Segmentation fault (core dumped)
$ ./solaris32 ; ./solaris64
-4195232 -4195232 -4195235 -4195232 -4195232
Bus Error (core dumped)
2147482408 2147482408 2147482405 2147482408 2147482408
Bus Error (core dumped)
$ ./aix32 ; ./aix64
804398476 804398476 804398473 804398476 804398476
2 2 256 2 2
-2972 -2972 -2975 -2972 -2972
Segmentation fault (core dumped)
Enviado em 12/12/2018 - 20:29h
#include <algorithm>
#include <iostream>
#include <functional>
#include <numeric>
int main()
{
int arr[5];
std::iota(arr, arr+5, 1);
int fatorial5 = std::accumulate(arr, arr+5, 1, std::multiplies<int>{});
std::cout << fatorial5 << std::endl;
return 0;
}
std::iota(&arr[0], &arr[5], 1);
std::iota(std::begin(arr), std::end(arr), 1);
Enviado em 12/12/2018 - 21:28h
id(p){ return p; }
main(){
int v[]={1, 2, 3};
int *a, *b, *c, *d;
a=v+1; /* Aritmética de ponteiro. OK. */
b=id(v)+1; /* Ponteiro se perde. Aritmética com dois inteiros. */
c=id(v+1); /* Aritmética de ponteiros antes da função. Depois o ponteiro se perde. */
d=id(v)+sizeof *v; /* Ponteiro se perde. Valor certo do endereço obtido manualmente. */
printf("%d %d %d %d %d\n", &v[1], a, b, c, d);
printf("%d %d %d %d %d\n", v[1], *a, *b, *c, *d);
} $ ./linuxpc32 ; ./linuxpc64
-3798332 -3798332 -3798335 -3798332 -3798332
2 2 33554432 2 2
-755092352 -755092352 -755092355 -755092352 -755092352
Segmentation fault (core dumped)
$ ./solaris32 ; ./solaris64
-4195232 -4195232 -4195235 -4195232 -4195232
Bus Error (core dumped)
2147482408 2147482408 2147482405 2147482408 2147482408
Bus Error (core dumped)
$ ./aix32 ; ./aix64
804398476 804398476 804398473 804398476 804398476
2 2 256 2 2
-2972 -2972 -2975 -2972 -2972
Segmentation fault (core dumped)
Enviado em 13/12/2018 - 11:25h
// Exemplo 1: usando notação de arrays.
int strcmp(const char *s1, const char *s2){
int i, diff;
i=0;
do
diff=s2[i]-s1[i];
while(diff==0 && s1[i] && s2[i++]);
return diff;
}
// Exemplo 2: usando aritmética de ponteiros.
int strcmp(const char *s1, const char *s2){
int diff;
do
diff=*s2-*s1;
while(diff==0 && *s1++ && *s2++);
return diff;
}
Entre na sua conta para responder.