• 关于指针的一种用法


    在看别人的程序时发现的

    假定有两个函数A和B

    在函数A中new BYTE[]一个数组,之后将这个数组的地址(new之后会产生这个数组的首地址)以参数的形式传递给函数B

    在函数A结束时删掉这个动态申请的数组。

    在函数A结束之前函数B由于被调用就开始执行

    在函数B中可以用这个首地址以数组的方式(下标访问)来访问这块内存

    示例如下:

    void CALLBACK CBTHDlg::OnSerialRead(void *pOwner, BYTE *buf, DWORD buflen)//----------------------------函数A
    {
    	BYTE *pRecvBuf = NULL;
    	CBTHDlg *pThis = (CBTHDlg*)pOwner;
    	
    	pRecvBuf = new BYTE[256];
    	ZeroMemory(pRecvBuf, 256);
    	CopyMemory(pRecvBuf, buf, buflen);
    	pThis->PostMessageW(WM_RECV_SERIAL_DATA, WPARAM(pRecvBuf), buflen);//首地址pRecvBuf以参数的形式传给函数B
    	delete []pRecvBuf;
    	pRecvBuf =NULL;
    }
    LONG CBTHDlg::OnRecvSerialData(WPARAM wParam, LPARAM lParam)//--------------------函数B
    {
    	
    	char *aRecv = (char *)wParam;
    	CString strRecv = L"";
    	static CString strRecv1 = L"";
    	CEdit *pEdtRecv = (CEdit*)GetDlgItem(IDC_EDT_RECV);
    	CButton* pBtnCheck = (CButton*)GetDlgItem(IDC_CHK_16);
    	int state = pBtnCheck->GetCheck();
    	
    	if(state == 0)
    	{
    		pEdtRecv->GetWindowTextW(strRecv1);
    		strRecv = CString(aRecv);
    		pEdtRecv->SetWindowTextW(strRecv1+strRecv);
    	}
    	else
    	{
    		int i;
    		
    		//strRecv = CString(aRecv);
    		for(i = 0; i<lParam; i++)
    		{
    			strRecv.Format(L"%x", aRecv[i]);//函数B中以数组下标的方式来访问这一块内存
    			pEdtRecv->GetWindowTextW(strRecv1);
    			pEdtRecv->SetWindowTextW(strRecv1+strRecv);
    		}
    	}
    	delete[] aRecv;
    	aRecv = NULL;
    	return 0;
    }


  • 相关阅读:
    linq中的AsEnumerable()方法
    c# 一个匿名对象中包含多个子对象的处理方式
    jenkins的安装与启动
    牛客网-2018年湘潭大学程序设计竞赛-F
    poj-1149(最大流)
    hdu-2255(带权二分图)
    bzoj-1191(二分图最大匹配)
    codevs2822
    hdu 5652(并查集)
    hdu—3861(tarjan+二分图)
  • 原文地址:https://www.cnblogs.com/lmzjh/p/4263991.html
Copyright © 2020-2023  润新知