2016-12-22 4 views
0

下に2つのコードサンプルがあります。最初の私はドットでのみ動作することができます。私は矢印 - >演算子でしか動かすことができません。しかし、なぜ?どちらの場合でもポインタはありませんか?Cの矢印と点の演算子

矢印のコード - >演算子:

#include <stdlib.h> 
#include <stdio.h> 

typedef struct{ 
    double **plist; 
} ParticleList; 

void sendPar(ParticleList *pl, int *n, int np){ 
    pl -> plist = malloc(sizeof(double*) * np); 
    for(int p=0; p<np; p++){ 
     pl->plist[p] = malloc(sizeof(double) * n[p]); 
    } 

    for(int p=0; p<np; p++){ 
     for(int k=0; k<n[p]; k++){ 
      pl->plist[p][k] = k+1; 
     } 
    } 
} 

int main(){ 
    ParticleList pl; 
    int np = 3; 
    int n[np]; 
    n[0] = 2; 
    n[1] = 4; 
    n[2] = 7; 
    sendPar(&pl, n, np); 
} 

ドットのためのコード。演算子:

#include <stdlib.h> 
#include <stdio.h> 

typedef struct{ 
    double **plist; 
} ParticleList; 

void sendPar(int *n, int np){ 
    ParticleList pl; 
    pl.plist = malloc(sizeof(double*) * np); 
    for(int p=0; p<np; p++){ 
     pl.plist[p] = malloc(sizeof(double) * n[p]); 
    } 

    for(int p=0; p<np; p++){ 
     for(int k=0; k<n[p]; k++){ 
      pl.plist[p][k] = k+1; 
     } 
    } 
    free(pl.plist); 
} 

int main(){ 
    int np = 3; 
    int n[np]; 
    n[0] = 2; 
    n[1] = 4; 
    n[2] = 7; 
    sendPar(n, np); 
} 

どちらのバージョンも有効ですか、それとも違いがありますか?

+1

"どちらの場合でもポインタはありませんか?"いいえ、「ParticleList * pl」と「ParticleList pl」の違いは見えませんか? – itsme86

+0

便利な質問:http://stackoverflow.com/questions/2575048/arrow-operator-usage-in-c?rq=1 –

+0

ドット '.'と矢印' - > '演算子は非常に緊密に結びついていますスペースで囲むべきではありません。 –

答えて

1

最初の例では、plParticleListのポインタです。 struct型ポインタのメンバを逆参照するには、->を使用します。

plは、ParticleListの構造体であり、ポインタではありません。構造体メンバを逆参照するには、ドットを使用します。

2

第1のケースでは、ポインタを使用しています。したがって、矢印演算子->を使用することが正しいです:第二の場合

void sendPar(ParticleList *pl, int *n, int np){ 
    pl->plist 

、あなたはポインタが、値を使用していません。これDOT .演算子を使用して、正しい(必要)です。それだけです

ParticleList pl; 
pl.plist = 

- あなたは、ドットまたは矢印演算子のいずれかの前後にスペースを入れないことを除いて。