C语言指针自增的问题

发布于 2022-09-03 08:38:39 字数 749 浏览 15 评论 0

//最简单的创建多线程实例
#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

心安伴我暖 2022-09-10 08:38:39

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++)

  1. 先计算 (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个字节。

  2. 再计算 *(mFun++)
    由于 mFun++ 返回 mFun 的值,对 *mFun++ 操作就是对 mFun 所指向的值进行的操作(注意不是对 mFun)。整个语句中,并没有对 *mFun 进行操作,那么 mFun 所指向的值就不会变。

在平常使用的时候,不用去思考那么多:

  • *mFun++ = a; 相当于:*mFun = a; mFun += 1;

  • *++mFun = a; 相当于:mFun += 1; *mFun = a;

0x02 *mFun++ 扩展一下

const int *mFun = (int *)arg;
*mFun++ = 5;

看看编译器提示你啥。

兮子 2022-09-10 08:38:39

我尝试解释一下

前提 mFun 是指针

1、

*mFun++; 
*、++ 是有优先级的 ++ 大于 * 
*mFun++; 清晰的写法就是 *(mFun++)

分解
a、 mFun++ ,指针的自增,mFun++ 里面本身存的地址值增加了 4 个字节,记 B 地址,但是返回的还是原来的 mFun 的存的地址值,记 A 地址(别问我为什么,c 自增的特性)
b、 *(mFun++),对一个指针取*,就会得到一个实际的存储数值,是 A 地址指向的值
2、
printf("子线程的线程ID号为:%d\n", *mFun);//请问为什么此处的*mFun的值被改变,而传入的参数的值未改变**

到了这步,mFun 就是 B 地址了,所以 *mFun ,就是 B 地址指向的值,所以 *mFun的值被改变

为什么传入的参数值不变?因为参数指针的值没有改变,本来就是赋值给了 mFun,然后修改了 mFun 的值罢了
走过海棠暮 2022-09-10 08:38:39

经过我的断点调试,发现*mFun++等同于mFun++,直接上图:
图片描述

执行完*mFun++后,mFun的存储的地址值改变了(移动了4个字节,正好是一个整数的位置),至于为什么会这样,我也解释不了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文