c - 如何遍历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 吗?
解决方案
赋值没有意义,因为函数原型
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;
}
推荐阅读
- excel - Excel - 从有条件的列表中获取 x 个值
- postgresql - org.postgresql.util.PSQLException:错误:列是 cidr 类型,但表达式是字符类型
- php - 我如何更改虚拟产品的 woocommerce 计费信息文本
- unity3d - 如何让 2D RayCast 完全忽略具有特定标签 Unity 2D 的对撞机
- javascript - Braintree - 如何刷新 javascript 授权令牌?
- talend - Talend Open Studio 不支持的数据转换
- symfony - 具有 foreach 和多个参数的 QueryBuilder
- spring-boot - 使用带有 Redis 数据的 Spring Boot 获取密钥的问题
- swift - UIScrollView contentOffset 在方向更改后损坏
- android - 在 android 的 ExoPlayer 中播放第二个视频后,音频继续播放