对(void**)&的理解

一、为何发现

今天玩了一下W801(其实是不是800换马甲…我还留着2片菊花板)
发现了一个队列的传参是void **

receive,参数是 (void **)&msg

        tls_os_queue_receive(sock_c->sock_c_q, (void **)&msg, 0, 0);
        //printf("\n msg =%d\n",msg);
        switch((u32)msg)
        {
        case DEMO_MSG_WJOIN_SUCCESS:
            break;

        case DEMO_MSG_SOCKET_CREATE:
            socket_client_demo();
            break;

        case DEMO_MSG_WJOIN_FAILD:
            if(sock_c->socket_num > 0)
            {
                sock_c->socket_num = 0;
                sock_c->socket_ok = FALSE;
            }
            break;

        case DEMO_MSG_SOCKET_RECEIVE_DATA:
            break;

        case DEMO_MSG_UART_RECEIVE_DATA:

            while(sock_c->uart_trans)
            {
                tls_os_queue_receive(demo_sockc_q, (void **) &uart_msg, 0, 0);

                if((u32)uart_msg != DEMO_SOCK_MSG_UART_RX)
                {
                    continue;
                }

                readlen = (demo_sockc_uart.rxlen > DEMO_SOCK_BUF_SIZE) ?
                          DEMO_SOCK_BUF_SIZE : demo_sockc_uart.rxlen;
                demo_sockc_uart.rxbuf = tls_mem_alloc(readlen);
                if(demo_sockc_uart.rxbuf == NULL)
                {
                    printf("demo_socks_uart->rxbuf malloc err\n");
                    continue;
                }
                ret = tls_uart_read(TLS_UART_1, demo_sockc_uart.rxbuf, readlen);
                if(ret < 0)
                {
                    tls_mem_free(demo_sockc_uart.rxbuf);
                    continue;
                }
                demo_sockc_uart.rxlen -= ret;
                readlen = ret;

                offset = 0;
                do
                {
                    ret = send(sock_c->socket_num, demo_sockc_uart.rxbuf + offset, readlen, 0);
                    offset += ret;
                    readlen -= ret;
                }
                while(readlen);
                tls_mem_free(demo_sockc_uart.rxbuf);
            }

            if (-1 == sock_c->snd_data_len)
            {
                len = DEMO_SOCK_BUF_SIZE;
            }
            else if(sock_c->snd_data_len != 0)
            {
                len = (sock_c->snd_data_len > DEMO_SOCK_BUF_SIZE) ?
                      DEMO_SOCK_BUF_SIZE : sock_c->snd_data_len;
            }
            else
            {
                break;
            }

            memset(sock_c->sock_tx, 0x35, len);
            ret = send(sock_c->socket_num, sock_c->sock_tx, len, 0);
            if (ret != -1)
            {
                if (sock_c->snd_data_len != -1)
                {
                    sock_c->snd_data_len -= ret;
                }
            }
            if (sock_c->socket_ok && sock_c->snd_data_len != 0)
            {
                tls_os_time_delay(1);
                tls_os_queue_send(sock_c->sock_c_q, (void *)DEMO_MSG_UART_RECEIVE_DATA, 0);
            }
            break;

        case DEMO_MSG_SOCKET_ERR:
            tls_os_time_delay(200);
            printf("\nsocket err\n");
            create_client_socket_demo( );
            break;

        default:
            break;
        }

send,参数是(void *)

tls_os_queue_send(demo_sock_c->sock_c_q, (void *)DEMO_MSG_UART_RECEIVE_DATA, 0);

而这个数据是

#define	DEMO_MSG_UART_RECEIVE_DATA			4

这里没毛病的,判断的是 DEMO_MSG_UART_RECEIVE_DATA 这个数据(这个数据就是一个地址类型),而不是 DEMO_MSG_UART_RECEIVE_DATA 这个数据指向的数值( 内存是 4 这个地址的数值)
其实地址也是一个数值而已…

参考一下文章:https://blog.csdn.net/unix21/article/details/8923752

二、个人理解

要通过函数改变一个数据,那形参必须是这个数据的地址。传入地址的地址的好处,例如我需要传递不同数据类型的数据到函数里面,就可以通过这种方法来实现(就类似上述队列的数据


版权声明:本文为xuan530482366原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。