Funções, arrays, ponteiros

1. Funções, arrays, ponteiros

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Linux Mint)

Enviado em 13/01/2020 - 08:14h

O que tenho não é bem um problema, ao menos não agora, mas uma dúvida.

Se eu tiver esse código:

#include<stdio.h>
void fun(int x) {
x = 30;
}

int main(void) {
int x = 20;
fun(x);
printf("x = %d", x);
return 0;
}

ele retornará x = 20, mas se tiver:

# include <stdio.h>
void fun(int *ptr)
{
*ptr = 30;
}

int main()
{
int x = 20;
fun(&x);
printf("x = %d", x);

return 0;
}

ele retornará x = 30.

Eis agora meu código:
#include<stdio.h>
#include<math.h>

double ran1(long int *idum);
void correlacao(int Quantidade, double A, double E[]);

#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

long int SEED, SEED1;

int main(){

int QuantidadeMassas = 100, iMassa;
double A = 40.0, x[QuantidadeMassas], E[QuantidadeMassas], b = 1.5,
MassaTipo[3] = {0.5, 1.0, 1.5}, massa[QuantidadeMassas];
char aleN[200];
FILE *ale;

SEED1 = 1;
SEED = -SEED1;

sprintf(aleN, "Corr_A%1.2gSEED%ld.dat", A, SEED1);
ale = fopen(aleN, "w");

correlacao(QuantidadeMassas, A, E);

for(iMassa = 0; iMassa < QuantidadeMassas; ++iMassa){
if(E[iMassa] < -b){
massa[iMassa] = MassaTipo[0];
}else{
if(E[iMassa] > b){
massa[iMassa] = MassaTipo[2];
}else{
massa[iMassa] = MassaTipo[1];
}
}
fprintf(ale, "%d, %lf\n", iMassa, massa[iMassa]);
}
fclose(ale);
return 0;
}

double ran1(long int *idum){
int j;
long k;
static long iy=0;
static long iv[NTAB];
double temp;
if(*idum <= 0 || !iy){
if (-(*idum) < 1) *idum=1;
else *idum = -(*idum);
for(j = NTAB + 7; j >= 0; j--){
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if(*idum < 0) *idum += IM;
if(j < NTAB) iv[j] = *idum;
}
iy=iv[0];
}
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum < 0) *idum += IM;
j=iy/NDIV;
iy=iv[j];
iv[j] = *idum;
if((temp=AM*iy) > RNMX) return RNMX;
else return temp;
}
void correlacao(int Quantidade, double A, double x[]){
double E[Quantidade+2], xmedio, xmedio2, aux;
int k, n;
xmedio = xmedio2 = 0.0;
for(k = 1; k <= Quantidade; ++k){
E[k] = 2.0 * ran1(&SEED) - 1.0;
}
for(n = 1; n <= Quantidade; ++n){
x[n] = 0.0;
for(k = 1; k <= Quantidade; ++k){
x[n] += E[k] / pow((double)abs(k - n) / A + 1.0, 2.0);
}
xmedio += x[n];
xmedio2 += x[n] * x[n];
}
xmedio /= Quantidade;
xmedio2 /= Quantidade;
aux = 1.0 / sqrt(xmedio2 - xmedio * xmedio);
for(n = 1; n <= Quantidade; ++n){
x[n] = (x[n] - xmedio) * aux;
}
return;
}

A sintaxe da função correlacao é semelhante à do primeiro código, mas ele realiza com o vetor E uma função similar à do segundo código.

Quero saber por qual motivo isso ocorre?


  


2. Re: Funções, arrays, ponteiros

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/01/2020 - 19:16h

Porque, na declaração de um parâmetro de função, “nome_tipo variável[]” é sinônimo de “nome_tipo *variável”.

A razão para isso é histórica, e tem a ver com a forma como a linguagem C evoluiu. Uma narrativa em primeira mão (feita pelo próprio criador do C, o já falecido Dennis Ritchie) está disponível em https://www.bell-labs.com/usr/dmr/www/chist.html, na seção com título Embryonic C.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts