再开一篇关于C++程序设计基核心之一:引用,指针,符号优先级,函数参数传递

本文详细解析了C++中指针的基础概念、指针与变量的关系、参数传递机制,包括指针的赋值、地址运算、swap函数应用及指针参数导致的问题与解决方案,特别关注了在特定函数中将list数据转存到数组指针时出现的陷阱与正确处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://zhidao.baidu.com/link?url=mfGNT59IIvC4nQJ2R8f6Y74Lzdq30PVDAbFD79-6a9nB5rzuxzLHK602RWMtO0xKwIX3laBFKsMI7P1FExhcxa

http://zhidao.baidu.com/link?url=o0zzzHmsqaMTjML2NpKq6N8gHkx_6xBfukXn4QDYfTWrAYS-wupkXyutSP6s-ohfJ7lFtiRYygSG8C_nq6Q3Qa

http://www.cnblogs.com/yanlingyin/archive/2011/12/07/2278961.html

http://book.2cto.com/201402/40248.html

http://bbs.youkuaiyun.com/topics/390242879

http://tieba.baidu.com/p/2757128569


小结:

单纯说  

1)int * p;定义

int *p=&a;赋值。。。。。。。错错错!!!只能int * p;p=&a;

int为基类型;p为指针变量名,p的值即一个变量的实际的地址叫做指针;*不是指针变量名的一部分;

*p不能用一个整数进行初始化赋值;定义时,必须按上述的结构,指定基类型;

*p表示p所指向的变量

2)自右自左:

&*p 为int变量的地址

*&a 为int型变量a

3)参数传递

swap(int *p1,int*p2);函数定义,形参;

swap(&a1,&a2)函数调用,实参

swap(p3,p4);

指针变量作为参数,是通过调用函数使变量的值发生变化,在主调函数中使用这些改变的值。。调用函数可以改变实参指针变量指向变量的值,但是指针变量的值不会改变

4)p1+1 表示使指针移动一个位置,移动int所占字节,即4

5)问题代码:

void swap(int *p1,int * p2)

{

int * temp;

*temp =*p1;//错误。。。。。。。。。应改为temp = *p1;*temp是指针变量temp所指向的变量,没有对temp赋初值,temp并无确定值,temp所指向单元不可预见,这种情况对*temp是危险的

*p1 =*p2;

*p2 = *temp;

}

正确:

void swap(int *p1,int * p2)

{

int  temp;

temp =*p1;

*p1 =*p2;

*p2 = *temp;

}

6)遇到的问题:

int CMatReadAndWrite::SetDataFromList(const list<double>& lstVarValue,double& data)
{
list<double>::const_iterator iter;
for(iter=lstVarValue.begin();iter!=lstVarValue.end();iter++)
{
&data = iter;
m_data =&data;
m_data+=1;
}
int i;
m_data-=lstVarValue.size();
for(i=0;i<lstVarValue.size();i++)
{
      cout<<*m_data<<endl;
      m_data++;
}


m_NDim = lstVarValue.size();
m_MDim = 1;
    return 0;
}

我希望在这个函数中将list的数据转存到数组指针,m_data是一个成员变量;

调试过程中发现错误在于:for中每次循环,

                data = *iter;
m_data =&data;
m_data++;

这是一个data是一个变量别名,而其主,即实参为一个local变量tempdouble;每次我循环m_data取得的都是data的地址,而这个地址,从实参看来是不变的,所以,我的

m_data++没有用,m_data就没有移动过。。。

思考解决方法:

             改为 &data =iter;结果报错——“赋值运算的左操作数必须是左值”。

左值:C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。

k+c=32;这就不对。。k+c到底是哪个存储单元,不清楚。。

       改为m_data =&data;

             *m_data =*iter;

           m_data++;

这还是没改啊,都是每次又指向回了data

     改为:只有两行,

 *m_data =*iter;

           m_data++;

结果调试程序的时候直接,退出;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值