4.关于指针的两个看似简单实则意义深远的题
2012-04-04 21:32
260 查看
0.指针是无私的,它并不关系自己,只关心指向的那个变量 。
int a = 1 ;
int *p1 = &a ;
*p1 += 1;
cout<<a<<*p1<<endl;
输出结果为,a = 2,*p1 = 2;
结论:指针是无私的,它并不关心自己,只关心指向的那个变量,,说白了,,就是间接引用那个变量,指针没有值,只是地址。
对*指针的操作就是对指向变量的操作!!!
1.void main()
{
int a ,b ;
int *p,*p1,*p2;
p2 = &b;
p1 = &a;
cout<<"输入两个值"<<endl;
cin>>a>>b;
if (a<b)
{
p = p1;
p1 = p2 ;
p2 = p;
}
cout<<"a = ? p1 = ? *p1 = ?"<<a<<" "<<p1<<" "<<*p1<<endl;
cout<<"b = ? p2 = ? *p2 = ?"<<b<<" "<<p2<<" "<<*p2<<endl;
}
结果:假如输入a = 1,b = 2。
输出结果为 a = 1 ,p1 = 611100 ,*p1 = 2;
b = 2 ,p2 = 610004,*p2 = 1;
if (a<b) --- a.b并未交换,,交换的只是p1,p2的地址。交换的只是p1和p2的指向,a,b值并未改变!!!!!
{
p = p1;
p1 = p2 ;
p2 = p;
2.不改变输入的三个数(利用指针),将三个数排序,按*p1最大,*p2 ,*p3的顺序排出。。。利用指针!!!!!/
利用交换指针的指向,而不改变原来的变量值!!
int a,b,c;
int *p, *p1=&a, *p2=&b, *p3=&c;
cout<<"输入a,b,c"<<endl;
cin>>a>>b>>c;
if (*p1<*p2)//不要写成a<b,或者b<c之类的。因为后面的第二次比较第二次比较中,要求*p1是大的那个,,这时候*p1具体是a,还是b是未知的。
p = p1;
p1 = p2;
p2 = p; //交换指针的指向,不改变原来的变量值!!
}//先比较出两个之中较大的那个
if (*p1 < *p3)
{
p = p1;
p1 = p3;
p3 = p;
}//如果*p3最大,,那么执行完第二次比较之后,p3指向第一次比较后较大的那个结果。接下来的比较就应该,将p3和p2指向互换,也就是下面的比较执行
//如果,*p3比第一次比较后的*p1小,那么p2和p3比较,互换。
if (*p2 < *p3)//比较条件必须是*p2 < *p3,,因为要求是*p2是第二大的那个
{
p = p2;
p2 = p3;
p3 = p ;
}
cout<<*p1<<" "<<*p2<<" "<<*p3<<endl;
}
3.
int *p, *p1=&a, *p2=&b,
if (*p1<*p2)
{
*p = *p1;///严重注意这里!!:p并没用被初始化地址,,它的地址这时候是任意的,当你把*p1(a变量)赋给未知地址的指针时候,,这时候系统会报错!!
*p1 = *p2;
*p2 = *p;
4.
int p, *p1=&a, *p2=&b,
if (*p1<*p2)
{
p = *p1;//这时候就没错了,因为p声明的是一个变量,而不是指针!
*p1 = *p2;
*p2 =p;
5.注意;使用指针对数的排序是非常广泛的!!!!
6.输入两个数,利用指针函数对两个数进行由大到小的排序。
void swap(int *p1,int *p2)//这里的形参中,一定要加*号,用来说明函数的形参是指针变量
{
int temp;
temp = *p1;
*p1 = *p2 ;
*p2 = *p1 ;
cout<<*p1<<*p2<<endl;
}
void main()
{
cout<<"输入两个数“<<endl;
int a,b;
cin>>a>>b;
int *point = &a ,*point2 = &b;
if(a<b)
{
swap(ponit1,point2)//注意:这里不用在point2前面加*号!!,这里已经是指针变量了,,再加就错了!
cout<<a<<b<<endl;
cout<<*point1<<*point2<<endl;
}
结果:假如输入的是1和2;
那么结果为
输出a = 2,b = 1;
a = 2,b = 1
a = 2,b = 1;
可以看出,,利用指针的函数,,其值传递方式是前后一致的,函数里和主函数中一起改,因为指针引用的就是主函数的变量,是同一个变量,并不是按值传递方式。
这就叫利用指针传递方式。
int a = 1 ;
int *p1 = &a ;
*p1 += 1;
cout<<a<<*p1<<endl;
输出结果为,a = 2,*p1 = 2;
结论:指针是无私的,它并不关心自己,只关心指向的那个变量,,说白了,,就是间接引用那个变量,指针没有值,只是地址。
对*指针的操作就是对指向变量的操作!!!
1.void main()
{
int a ,b ;
int *p,*p1,*p2;
p2 = &b;
p1 = &a;
cout<<"输入两个值"<<endl;
cin>>a>>b;
if (a<b)
{
p = p1;
p1 = p2 ;
p2 = p;
}
cout<<"a = ? p1 = ? *p1 = ?"<<a<<" "<<p1<<" "<<*p1<<endl;
cout<<"b = ? p2 = ? *p2 = ?"<<b<<" "<<p2<<" "<<*p2<<endl;
}
结果:假如输入a = 1,b = 2。
输出结果为 a = 1 ,p1 = 611100 ,*p1 = 2;
b = 2 ,p2 = 610004,*p2 = 1;
if (a<b) --- a.b并未交换,,交换的只是p1,p2的地址。交换的只是p1和p2的指向,a,b值并未改变!!!!!
{
p = p1;
p1 = p2 ;
p2 = p;
2.不改变输入的三个数(利用指针),将三个数排序,按*p1最大,*p2 ,*p3的顺序排出。。。利用指针!!!!!/
利用交换指针的指向,而不改变原来的变量值!!
int a,b,c;
int *p, *p1=&a, *p2=&b, *p3=&c;
cout<<"输入a,b,c"<<endl;
cin>>a>>b>>c;
if (*p1<*p2)//不要写成a<b,或者b<c之类的。因为后面的第二次比较第二次比较中,要求*p1是大的那个,,这时候*p1具体是a,还是b是未知的。
p = p1;
p1 = p2;
p2 = p; //交换指针的指向,不改变原来的变量值!!
}//先比较出两个之中较大的那个
if (*p1 < *p3)
{
p = p1;
p1 = p3;
p3 = p;
}//如果*p3最大,,那么执行完第二次比较之后,p3指向第一次比较后较大的那个结果。接下来的比较就应该,将p3和p2指向互换,也就是下面的比较执行
//如果,*p3比第一次比较后的*p1小,那么p2和p3比较,互换。
if (*p2 < *p3)//比较条件必须是*p2 < *p3,,因为要求是*p2是第二大的那个
{
p = p2;
p2 = p3;
p3 = p ;
}
cout<<*p1<<" "<<*p2<<" "<<*p3<<endl;
}
3.
int *p, *p1=&a, *p2=&b,
if (*p1<*p2)
{
*p = *p1;///严重注意这里!!:p并没用被初始化地址,,它的地址这时候是任意的,当你把*p1(a变量)赋给未知地址的指针时候,,这时候系统会报错!!
*p1 = *p2;
*p2 = *p;
4.
int p, *p1=&a, *p2=&b,
if (*p1<*p2)
{
p = *p1;//这时候就没错了,因为p声明的是一个变量,而不是指针!
*p1 = *p2;
*p2 =p;
5.注意;使用指针对数的排序是非常广泛的!!!!
6.输入两个数,利用指针函数对两个数进行由大到小的排序。
void swap(int *p1,int *p2)//这里的形参中,一定要加*号,用来说明函数的形参是指针变量
{
int temp;
temp = *p1;
*p1 = *p2 ;
*p2 = *p1 ;
cout<<*p1<<*p2<<endl;
}
void main()
{
cout<<"输入两个数“<<endl;
int a,b;
cin>>a>>b;
int *point = &a ,*point2 = &b;
if(a<b)
{
swap(ponit1,point2)//注意:这里不用在point2前面加*号!!,这里已经是指针变量了,,再加就错了!
cout<<a<<b<<endl;
cout<<*point1<<*point2<<endl;
}
结果:假如输入的是1和2;
那么结果为
输出a = 2,b = 1;
a = 2,b = 1
a = 2,b = 1;
可以看出,,利用指针的函数,,其值传递方式是前后一致的,函数里和主函数中一起改,因为指针引用的就是主函数的变量,是同一个变量,并不是按值传递方式。
这就叫利用指针传递方式。
相关文章推荐
- 在C++中两个指针相加有意义么?
- VC++下一个看似简单实则很有“内涵”的C/C++字符数组初始化问题
- flex 3.0中关于两个.mxml文件之间链接的简单方法
- 学习Java的第一步是安装好JDK,写一个Hello World, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加
- 关于WPF的两个窗口之间简单的数据传递【附源代码】
- 简单LinuxC程序关于倒置句子中的单词位置(指针的使用)
- i++不是原子操作,看似简单,实则巨坑的一个线程同步的问题。synchronized 和 volatile
- ios关于点击事件selector传参的问题,看似简单却容易混淆(已解决)
- 关于DELPHI中的类对象以及类指针简单探讨总结。
- 关于指针和const限定符问题的一个简单判断方法
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 两个看似简单但却非常难以回答的问题
- 关于java整形数组的两个简单操作
- 关于动态数组指针操作的两个例子
- 关于所写的两个简单sql 循环语句的疑问
- 心得: 把具体的事物概念话, 再通过概念划的思维解决事物, 得出结果化的时候再进行具体化, 看似简单实则不易啊
- 关于WPF的两个窗口之间简单的数据传递
- 关于动态数组指针操作的两个例子
- 关于二维指针强制转换及传递的简单剖析
- 关于C/C++指针的两个要点