2017-04-25 10 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


typedef struct data{ 
    char name[20]; 
    char lastname[25]; 
    int age; 
}person; 

void insert(person *p,int *num); 
int main() 
{ 
    int num; 
    person p; 
    insert(&p,&num); 
    printf("Name: %s",p[0].nome); /* Here i would print the first struct by 
    my array, but: is not array or not pointer Why?? */ 


} 

void insert(person *p, int *num) 
{ 
    int dim; 
    person *arr; 
    printf("Insert how many people do you want? "); /* How many index the 
    array should have */ 
    scanf("%d",&dim); 
    arr = (person *) malloc(dim*sizeof(person)); /* I'm not sure for 
    this explicit cast. */ 

for(int i = 0; i < dim; i++) 
{ 
    printf("Insert name: "); 
    scanf("%s",arr[i].name); 
    printf("Insert lastname: "); 
    scanf("%s",arr[i].lastname); 
    printf("Insert age:': "); 
    scanf("%d",&arr[i].age); 
} 
*num = dim; 
*p = *arr; 
} 

私が試してみた: `人*のインサート(int型* num個)構造体の配列を参照する方法はありますか?

そして、それは作品をだが、どのように配列の参照を渡すことができます`

このプログラムの開発は、あなたがしたいですかどのように多くの人が尋ねるべき?挿入するには、名前、姓、年齢を尋ねる必要があります。

挿入後、彼は印刷する必要がありますが、素早く、array(structs)の最初の要素(index)で試してみました。

+2

Cは、参照を持っているか、参照渡しありません。すべての関数の引数は値によって渡され、値だけが返されます。ただし、(値で)ポインタを渡すことも、ポインタを返すこともできますが、同様の効果があります。 –

答えて

3

配列全体を関数から返すことはできませんが、配列の基本位置を返すことはできます。たとえば、次のようにすることができます:person *insert(int *sz);。しかし、あなたのコードでは&p&num変数を挿入メソッドに渡していますが、その関数内で変数を変更し、後でmain()で操作したいと思うかもしれません。 person *p

  1. 変更ライン16 person p:そのために私は、これらの勧告を持っているでしょう。 pは配列の基底値を保持するはずです。配列名は、リストの最初の要素のベースアドレスにすぎないことを覚えておいてください。
  2. person*ではなく、person**を受け取るように関数の定義を変更してください。ポインタ変数を変更したいので、ポインタ変数へのポインタが必要です。 `void insert(person ** p、int * num)
  3. 使用後にメモリを解放します。メインの末尾にfree(p)を追加します。

`

関連する問題