下面的相关两段C代码:
static const char * const ts_name_default[] = {
"/dev/input/ts",
"/dev/input/touchscreen",
"/dev/touchscreen/ucb1x00",
NULL
};
if (dev_name != NULL) {
ts = ts_open(dev_name, nonblock);
} else {
defname = &ts_name_default[0];
while (*defname != NULL) {
ts = ts_open(*defname, nonblock);
if (ts != NULL)
break;
++defname;
}
}
第二段代码中的++defname;我不明白,这里defname是ts_name_default数组中第0个字符串的指针,怎么还可以作“++”运算?
在第二段代码中,defname 被定义为指向 ts_name_default 数组的一个指针。要理解为什么可以对 defname 执行 ++ 运算,我们需要深入了解 C 语言中指针的概念以及数组的表示方式。
关键点分析
-
ts_name_default的定义:static const char * const ts_name_default[] = { "/dev/input/ts", "/dev/input/touchscreen", "/dev/touchscreen/ucb1x00", NULL };- 这是一个数组,类型是
const char * const,每个元素都是一个字符串指针。 - 数组的每个元素都是指向字符串的指针。
- 数组的最后一个元素是
NULL,用于标记数组结束。
- 这是一个数组,类型是
-
defname的初始化:defname = &ts_name_default[0];defname是一个指向const char * const的指针,它初始化为指向ts_name_default数组的第一个元素,即"/dev/input/ts"的地址。
-
指针的递增 (
++):- 在 C 中,指针的递增操作会将指针移动到下一个元素的位置。
- 对于
defname,它指向的是ts_name_default中的元素,每次执行++defname,指针将移动到数组中的下一个字符串指针。
-
代码作用:
while (*defname != NULL) { ts = ts_open(*defname, nonblock); if (ts != NULL) break; ++defname; }*defname是当前指向的字符串指针的内容。- 如果当前字符串指针不为
NULL,调用ts_open。 - 如果
ts_open成功(返回非空值),循环结束。 - 如果
ts_open失败(返回NULL),通过++defname将指针移动到下一个字符串指针,继续尝试。
总结
在 C 语言中,数组的名称实际上是一个指针,指向第一个元素。通过指针递增 (++) 可以访问数组中的下一个元素。对于 defname,它是指向字符串指针数组元素的指针,每次递增都会指向数组中的下一个字符串指针。这是完全合法且常见的用法。

被折叠的 条评论
为什么被折叠?



