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++;
结果调试程序的时候直接,退出;