【发布时间】:2020-02-07 10:06:40
【问题描述】:
在“嵌入式C编程”一书的“内存和指针”一章中,Mark Siegesmund给出了以下示例:
void Find_Min_Max( int list[], int count, int * min, int * max){
for( int i=0, min=255, max=0; i<count; i++){
if( *min>list[i])
*min=list[i];
if( *max<list[i] )
*max=list[i];
}
}
// call like this: Find_Min_Max( table, sizeof(table), &lowest, &highest);
如果我理解正确:
- table 是一个 int 数组,
- count 是数组的大小
- 调用时,&lowest 和 &highest 是要存储结果的 int 变量的地址
- 函数定义中的int * min和int * max指的是指针* min和* max,都是整数类型
- 最后一行中定义的 &lowest 和 &highest 实际上是指向具有 int 类型变量的地址的指针
(不是 100% 确定最后一个。)
在 for 循环中,他每次将数组列表中的下一个 int 与指针 *min 和 *max 地址处的值进行比较,并在必要时更新这些地址处的值。
但是在循环的定义中,他定义了min = 255,max = 0。
在我看来,这似乎是两个尚未初始化的全新变量。 该行不应该是
for( int i=0, *min=255, *max=0: i<count; i++){
这是书上的错误还是我误解了什么?
【问题讨论】:
-
不是该代码中的唯一错误:
:而不是;,将min和max参数隐藏在循环内,尝试取消引用int变量,假设列表可以包含不超过 255 个项目,不包括空列表,... -
那个 : 而不是 ;是我的一个错字(现已更正)。取消引用发生在哪里?将最小/最大参数隐藏在循环中是什么意思?
-
for(int i=0, max=1,min=2; i <count; i++){}:前两个逗号是 not 逗号运算符,而是声明列表的一部分。这也是一种糟糕的风格。 -
@DieterVansteenwegenON4DD :
for循环初始化语句定义了 3 个新的int变量(i、min和max)。后两者与周围作用域中的变量具有相同的名称,因此它们将那些隐藏在for循环的作用域中。 IE。在for循环内使用min时,它指的是在init语句中定义的int;当在for循环外使用min时,它指的是int*参数。 -
@SanderDeDycker 这很有道理,并消除了我的一些疑虑。我无法将其标记为答案,因为它在评论中...