指针作为参数,可以修改指针指向对像的值,这个外面的也会被修改。修改指针的指向,外面的指针并不会被修改,需要用到指向指针的指针。
#include<iostream>
#include <vector>
using namespace std;
/*
void getMemory(char *p,int num)
{
p = (char*)malloc(num);
}
*/
void getMemory(char **p,int num)
{
*p = (char*)malloc(num);
}
int main() {
char *p =NULL;
int num = 100;
getMemory(&p, num);
//getMemory(p, num);
char * test = "test";
strcpy(p, test);
printf("%s \n", p);
free(p);
system("pause");
return 0;
}
#include<stdio.h>
int main()
{
int a, *p1, **p2;
a=65;
p1=&a;
p2=&p1;
printf("a = %d\n", a);
printf("address of a = %d\n", &a);
printf("p1 = %d\n", p1);
printf("address p1 = %d\n", &p1);
printf("*p1 = %d\n", *p1);
printf("p2 = %d\n", p2);
printf("*p2 = %d\n", *p2);
printf("**p2 = %d\n", **p2);
return 0;
}
应用场景,很多相同的代码,我需要把相同的代码抽成一个函数,抽成的函数需要返回2个指针,当然你也可以选择返回结构体。
主动调用的地方
ENHandlerResult CRequestEnterTable::ProcessUpdateSucc(CHandlerTokenBasic* ptoken, CSession* psession)
{
PBDSSGameTable *pPBDSSGameTable = NULL ; PBDSSTableSeat *pseat = NULL;
if(!Clienthandlerbase::Instance()->cs_response_dss_enter_table(psession, &pPBDSSGameTable, &pseat, EN_Position_MJ_XZ))
return EN_Handler_Done;
CPBGameTable* ptable = (CPBGameTable*)pPBDSSGameTable;
TableManager::Instance()->OnPlayerEnterTable(psession->_request_route.uid(), ptable->tid());
ptable->StopReadyTimer();
ptable->StartReadyTimer(120);
return EN_Handler_Done;
}
被动调用的地方
bool Clienthandlerbase::cs_response_dss_enter_table(CSession* psession, PBDSSGameTable** ptable, PBDSSTableSeat** pseat, ENPlayerPositionType gameId)
{
if (psession->_fsm_state == EN_EnterTable_State_ULOCK)
{
PBCSMsg msg;
CSResponseDssEnterTable& response = *msg.mutable_cs_response_dss_enter_table();
response.set_result(EN_MESSAGE_TABLE_NOT_EXIST);
Message::SendResponseMsg(RouteManager::Instance()->GetRouteByRandom(), psession, msg);
return false;
}
else if (psession->_fsm_state == EN_EnterTable_State_ULOCK_AF_SAVE)
{
PBCSMsg msg;
CSResponseEnterTable& response = *msg.mutable_cs_response_enter_table();
response.set_result(EN_MESSAGE_NO_EMPTY_SEAT);
Message::SendResponseMsg(RouteManager::Instance()->GetRouteByRandom(), psession, msg);
return false;
}
const CSRequestDssEnterTable& cs_request_enter_table = psession->_request_msg.cs_request_dss_enter_table();
int tid = cs_request_enter_table.tid();
*ptable = TableMgrbase::Instance()->FindTable(tid);
if(NULL == ptable)
return false;
*pseat = TableMgrbase::Instance()->FindEmptySeatInTable(**ptable, cs_request_enter_table.observe());
if(NULL == pseat)
{
psession->_fsm_state = EN_EnterTable_State_ULOCK_AF_SAVE;
PBUpdateData update;
update.set_key(PBUserDataField::kUserInfo);
{
PBDBAtomicField& field = *update.add_field_list();
field.set_field(EN_DB_Field_POS);
PBBPlayerPositionInfo& pos = *field.mutable_pos();
pos.set_pos_type(EN_Position_Hall);
pos.set_table_id(0);
pos.set_gamesvrd_id(0);
}
psession->NewAddUpdateData(psession->_request_route.uid(), update);
return false;
}
long long uid = psession->_request_route.uid();
//竞技场,记录玩家来自哪个亲友圈
if((**ptable).config().is_arena())
{
(**pseat).mutable_src_tea_bar()->set_tbid(cs_request_enter_table.src_tbid());
(**pseat).mutable_src_tea_bar()->mutable_tb_master()->set_uid(cs_request_enter_table.src_tb_master_uid());
}
const PBUser& user = psession->_kvdb_uid_data_map[uid].user_info();
int connect_id = cs_request_enter_table.connect_id();
const PBUserTeaBarData& tbdata = psession->_kvdb_uid_data_map[uid].user_tea_bar_data();
TableMgrbase::Instance()->SitDownOnTable(**ptable,**pseat,user,tbdata,connect_id);
PBCSMsg msg;
CSResponseDssEnterTable& response = *msg.mutable_cs_response_dss_enter_table();
CSNotifyTableInfo& info = *response.mutable_table_info();
TableMgrbase::Instance()->CopyTableToNotify(**ptable, info, uid);
response.set_result(EN_MESSAGE_ERROR_OK);
response.set_gamesvrd_id(TGlobal::_svid);
response.set_pos_type(gameId);
Message::SendResponseMsg(RouteManager::Instance()->GetRouteByRandom(), psession, msg);
return true;
}
版权声明:本文为q277055799原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。