C语言静态变量防重复执行原理及指针操作相关疑问
问题解答
为什么*x = ++N不会改变x的指向
这是C语言指针的基础语义决定的:
- 指针变量
x本身存储的是内存地址,只有直接修改x的值(比如执行x++、x = 其他地址这类操作)才会改变它的指向位置 - 语句中的
*是解引用运算符,*x代表的是x当前指向的内存单元,*x = ++N是给这块内存单元赋值,完全不会修改x本身存储的地址,因此不会改变它的指向。
你可以用这个简单示例验证:
uint32_t num = 10; uint32_t *p = # printf("修改前p的指向:%p,指向的内存值:%d\n", p, *p); *p = 20; printf("修改后p的指向:%p,指向的内存值:%d\n", p, *p);
运行后可以看到p的地址值完全没有变化,只是它指向的num的值变了。
代码缩进陷阱说明
你贴出的代码有缩进误导问题:C语言中for循环如果不写花括号,只有紧跟在for后的第一条语句属于循环体。你给出的代码里printf看起来是循环体的一部分,实际默认语法下它在循环外,只会执行一次。你能看到多次打印x的地址,说明你实际运行的代码应该是给for循环加了花括号把printf也包进去了,写代码的时候注意不要被缩进混淆逻辑。
static uint64_t N的工作原理
你提到不清楚这个静态变量的原理,补充说明:
- 函数内部用
static修饰的变量属于静态存储周期,它的内存会在程序整个运行期间保留,不会在函数调用结束后销毁 - 静态变量只会在第一次进入函数时完成初始化,后续调用函数时会沿用之前存储的值
- 结合你代码中
if (start == stop || *start) return;的逻辑,静态变量N可以保证哪怕回调被多次触发,守卫区域的计数也只会初始化一次,不会出现重复赋值、计数重置的问题。
内容的提问来源于stack exchange,提问作者DNG
相关产品推荐
相关产品推荐

