C语言指针自增的问题

查看:157
本文介绍了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;
}

解决方案

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;

看看编译器提示你啥。

这篇关于C语言指针自增的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆