通过指针访问结构数组

时间:2011-05-23 13:29:15

标签: c arrays function pointers struct

这里我有一个结构定义:

typedef struct person {
unsigned int ssn, age, height, weight, income;
char name[MAXS+1], job[MAXS+1], religion[MAXS+1], major[MAXS+1], minor[MAXS+1], gender;
}PERSON;

这里我有一个PERSON定义类型结构的函数数组:

    PERSON record[MAXR+1];

如何将此数组传递给另一个用于实时更新的函数(即作为指针)?

我的直觉和先前知识告诉我要做以下事情:

PERSON *rp[MAXR+1];
for(i=0; i<MAXR; i++){
        *rp[i]=&record[i];
    }
valid=readfile(fp, rp);

然而,我在作业中得到了一个&#34;不兼容的类型&#34;错误。 这样做的正确方法是什么?

以下是完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAXS 19
#define MAXR 999

typedef struct person {
unsigned int ssn, age, height, weight, income;
char name[MAXS+1], job[MAXS+1], religion[MAXS+1], major[MAXS+1], minor[MAXS+1], gender;
}PERSON;


//get and check ssn
int getssn(){
int num;

printf("\nSSN: ");
scanf("%d", &num);

if(num<=99999999 || num>999999999){
    printf("\nPlease input a valid SSN.\n");
    return 0;
}
else
    return num;
}

int readfile(FILE *fptr, PERSON **rptr){
int v=0, i, j;

for(i=0; i<MAXR; i++){
    j=i;
    if(fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
          &rptr[j]->gender, &rptr[j]->ssn, rptr[j]->name, &rptr[j]->age, 
          rptr[j]->job, &rptr[j]->income, rptr[j]->major, rptr[j]->minor,
          &rptr[j]->height, &rptr[j]->weight, rptr[j]->religion)==EOF)
        i=MAXR;
    if(&rptr[MAXR]->ssn==&rptr[j]->ssn)
        v=j;
}


return v;
}

int main(){
int valid=0, i;
char filename[MAXS]="clients.txt";
FILE *fp;
PERSON record[MAXR+1], *rp[MAXR+1];

do{
    record[MAXR].ssn=getssn();
}while(record[MAXR].ssn==0);

printf("Name of file of records: ");
//gets(filename);

if((fp=fopen(filename, "r"))==NULL)
    printf("\nCould not open file\n");
else{
    printf("\njur doing gohd\n");
    for(i=0; i<MAXR; i++){
        *rp[i]=&record[i];
    }
    valid=readfile(fp, rp);
    if(valid==0){
        printf("\nSSN %d is not found in file %s.\n", record[MAXR].ssn, filename);
    }
    else {
        printf("%d", valid);
    }
}



return 0;
}

4 个答案:

答案 0 :(得分:2)

您正在尝试将PERSON变量的地址分配给实际的PERSON变量(而不是地址),您可能想要这样做:

rp[i]=&record[i];

请注意,它会将指针复制到struct,而不是struct本身。如果要复制结构,则需要使用memcpymemmove

答案 1 :(得分:0)

你只需要:

int readfile(FILE *fptr, PERSON *rptr);

数组 - 明智的定义 - 只是指向已定义结构的一级指针。

int readfile(FILE *fptr, PERSON *rptr){
int v=0, i, j;

for(i=0; i<MAXR; i++){
    j=i;
    if(fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
          rptr[j]->gender, rptr[j]->ssn, rptr[j]->name, rptr[j]->age, 
          rptr[j]->job, rptr[j]->income, rptr[j]->major, rptr[j]->minor,
          rptr[j]->height, rptr[j]->weight, rptr[j]->religion)==EOF)
        i=MAXR;
    if(rptr[MAXR]->ssn==rptr[j]->ssn)
        v=j;
}

不需要指针到指针,因为你在函数之外声明了数组。如果你malloc在函数内部分配内存,那么你需要一个指向指针的指针来返回分配内存的指针 - 不过你的情况。

答案 2 :(得分:0)

还值得指出fptr [i] - &gt; job中隐含的括号。 它是(* fptr)[i],而不是* fptr [i]或*(fptr [i])。也就是说,你想索引 在你按照指针之后,而不是之前。

答案 3 :(得分:0)

数组不能直接传递给函数 - 如果你尝试,它只是传递一个指向数组第一个元素的指针(它可以像数组本身一样被索引以访问数组的任何成员)。这就是为什么你可能听说数组是“通过引用传递”的 - 尽管技术上是真的,这就是效果。

所以,你需要做的就是声明你的函数:

int readfile(FILE *fptr, PERSON rptr[])
{
    int v = 0, i;

    for(i = 0; i < MAXR; i++) {
        if (fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
          &rptr[i]->gender, &rptr[i]->ssn, rptr[i]->name, &rptr[i]->age, 
          rptr[i]->job, &rptr[i]->income, rptr[i]->major, rptr[i]->minor,
          &rptr[i]->height, &rptr[i]->weight, rptr[i]->religion) < 11)
            break;

        if (rptr[MAXR]->ssn == rptr[i]->ssn)
            v = i + 1;
    }

    return v;
}

...你可以直接调用它:

valid = readfile(fp, record);

根本不需要rp