首页 > 解决方案 > 如何遍历C中的结构数组?

问题描述

给出了以下结构:

typedef struct {    
    int a;    
    int b;    
    int c; 
} POST, *PPOST;

任务是创建一个函数int compare_post( PPOST pp, POST p);来检查“数组” pp 中是否存在相同的 p 副本,该副本以空指针结尾。

正确答案如下:

int compare_post( PPOST pp, POST p) {
       while( pp ){
            if((pp->a == p.a )&&(pp->b == p.b )&&(pp->c == p.c ))
               return 1;            
            pp++;     
       }
      return 0; 
}

我的问题是为什么while(pp)使用而不是while(*pp)?我们不需要取消引用 pp 来获取实际值以检测它在哪里是 NULL 吗?

标签: c

解决方案


赋值没有意义,因为函数原型

int compare_post( PPOST pp, POST p);

作业中提到的没有意义。函数参数pp不能是指向以指针终止的数组的第一个元素的NULL指针。如果数组要由NULL指针终止,则数组必须具有指针数据类型,即它必须是指针数组。但是,如果数组具有指针数据类型,则指向该数组第一个元素的指针必须是指向指针的指针。换句话说,必须有两个级别的指针间接。因此,必须将函数的第一个参数更改为以下内容:

int compare_post( PPOST *pp, POST p );

这相当于:

int compare_post( POST **pp, POST p );

为了清楚起见,并且因为有些人认为为指针创建 typedef 不合适,我将使用第二种语法。

使用这个新的函数原型,正确答案如下:

int compare_post( POST **pp, POST p ) {
    while ( *pp ) {
        if ( ( (*pp)->a == p.a ) && ( (*pp)->b == p.b ) && ( (*pp)->c == p.c ) )
            return 1;
        pp++;
    }
    return 0;
}

推荐阅读