C语言指针自增的问题
//最简单的创建多线程实例
#include <stdio.h>
#include <windows.h>
//子线程函数
DWORD WINAPI ThreadFun(void *arg)
{
const int *mFun = (int *)arg;
*mFun++; **//请问此处的自增为什么可以进行**
printf("子线程的线程ID号为:%d\n", *mFun); **//请问为什么此处的*mFun的值被改变,而传入的参数的值未改变**
return 0;
}
DWORD WINAPI ThreadAdd(void *arg)
{
int *m = (int *)arg;
*m= *m + 1000;
printf("子线程的线程ID号为:%d\n", *m);
return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
int m=1;
HANDLE handle1 = CreateThread(NULL, 0, ThreadFun, &m, 0, NULL);
HANDLE handle2 = CreateThread(NULL, 0, ThreadAdd, &m, 0, NULL);
WaitForSingleObject(handle1, INFINITE);
WaitForSingleObject(handle2, INFINITE);
printf("%d \n", m);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
0x00
mFun
是个啥const int *mFun = (int *)arg;
这个 declaration 的意思是: mFun 解引用之后是个 const int,并用 (int*)arg 初始化。它只是说不能通过 mFun 改变 mFun 指向的值,但并没有说不允许 mFun 改指向另一个地址。想要 mFun 这个指针不改指向其他地址,你需要这样写:
int * const a = (int *)arg;
。又想 mFun 不该指向其他地址,又要不能通过 mFun 修改其指向的值,你需要这样写:
const int * const a = (int *)arg
;0x01
*mFun++
啥意思*mFun++
根据运算符的优先级(运算符优先级确定计算顺序)来看,是这样的*(mFun++)
。先计算
(mFun++)
。后缀操作符 ++ 返回其操作数的值,在返回结果之后,对操作数自增(自增是一个 side effect,它发生在何时,我们唯一能确定的就是:The side effect of updating the stored value of the operand shall occur between the previous and the next sequence point.)。 在这里
mFun++
返回 mFun 的值,再对 mFun 自增。其中返回的 mFun 的值是一个左值,对这个返回值进行的操作就相当于对 mFun 进行操作。mFun 是一个指向 int 的指针,自增意味着指向下一个 int。在 int 为四个字节的机器上,指向下一个 int,那就是会移动4个字节。再计算
*(mFun++)
。由于 mFun++ 返回 mFun 的值,对
*mFun++
操作就是对 mFun 所指向的值进行的操作(注意不是对 mFun)。整个语句中,并没有对*mFun
进行操作,那么 mFun 所指向的值就不会变。在平常使用的时候,不用去思考那么多:
*mFun++ = a;
相当于:*mFun = a; mFun += 1;
。*++mFun = a;
相当于:mFun += 1; *mFun = a;
。0x02
*mFun++
扩展一下看看编译器提示你啥。
我尝试解释一下
前提 mFun 是指针
经过我的断点调试,发现
*mFun++
等同于mFun++
,直接上图:执行完
*mFun++
后,mFun的存储的地址值改变了(移动了4个字节,正好是一个整数的位置),至于为什么会这样,我也解释不了