指针过去式变量

bar*_*top 2 c for-loop pointer-arithmetic

据我所知,在 C 中检查指针是否是数组末尾的一个元素是完全合法的,如下所示:

char arr[16];

for (char* ptr = arr; ptr != arr + (sizeof arr / sizeof arr[0]); ++ptr) {
   // some code
}

Run Code Online (Sandbox Code Playgroud)

我的问题是,做这样的事情是否定义明确且合法(请注意,这段代码只是一个例子来表明我的观点。在实际代码中,我有处理数组的函数,我想知道我是否可以只传递指向本地 char 变量的指针和尺寸 1):

char c;
for (char* ptr = &c; ptr != (&c + 1); ++ptr) {
   // some code
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 7

来自 C 标准(6.5.6 加法运算符)

7 就这些运算符而言,指向不是数组元素的对象的指针与指向长度为 1 的数组的第一个元素的指针的行为相同,该数组的元素类型为该对象的类型。

所以这个循环

for (char* ptr = &c; ptr != (&c + 1); ++ptr) {
   // some code
}
Run Code Online (Sandbox Code Playgroud)

是正确的。