鱼C论坛

 找回密码
 立即注册
查看: 1770|回复: 2

有一个指针的问题

[复制链接]
发表于 2018-9-20 01:04:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1,下边是可以正确执行的例子:
#include<iostream>
using namespace std;
class Test{
    int num;
    double f1;
public:
    Test(int n){num = n;}
    Test(int n,double f){num=n;f1=f;}
    int GetNum () {return num;}
    double GetF() {return f1;}
};
int main(){
    Test one[2] = {2,4},*p;    //这里有一个关于one数组的问题:这里的形式和Test one[2] = {Test(2),Test(4)}是同等的吗
   
    Test two[2] = {Test(1,3.2), Test(5,9.5)};  //如果上边的同等,那么这里就应该可以写成Test two[2]={(1,3.2),(5,9.5)},但是我试了一下,发现并不可以这样写!!!
    for (int i=0;i<2;i++)
    {cout << "one["<<i<<"]="<<one[i].GetNum()<<endl;}
    p=two;
   
    for (int i=0;i<2;i++,p++)
        cout<<"two["<<i<<"]=("<<p->GetNum()<<","<<p->GetF()<<")"<<endl;
}

2,下边是有问题的代码
#include<iostream>
using namespace std;
class Test{
    int num;
    double f1;
public:
    Test(int n){num = n;}
    Test(int n,double f){num=n;f1=f;}
    int GetNum () {return num;}
    double GetF() {return f1;}
};
int main(){
    Test *one[2] = {new Test(2),new Test(4)},*p;
   
    Test *two[2] = {new Test(1,3.2),new Test(5,9.5)};
    for (int i=0;i<2;i++)
    {cout << "one["<<i<<"]="<<one[i]->GetNum()<<endl;}
    p=two;  //编译器会提示这里报错,请问这里跟上边的例子区别在哪了,为什么不能用同样的方法呢???
   
    for (int i=0;i<2;i++,p++){

        //cout<<"two["<<i<<"]=("<<p->GetNum()<<","<<p->GetF()<<")"<<endl;
}
说是指针的问题,写着写着就发现还有函数形式的问题 ,请各位大神帮我解答一下,谢谢啦!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-20 17:41:05 | 显示全部楼层
1.第一个问题
Test one[2] = { 2, 4 };
Test one[2] = {Test(2),Test(4)};   这两个确实是相等的,
但是下面两个不一样  
Test two[2] = { Test(1, 3.2), Test(5, 9.5) }   显示调用 Test(int n, double f)

Test two[2] = { (1, 3.2), (5, 9.5) };   隐式调用Test(int n)  ,具体可以单步调试看看这个调用的是哪个构造函数;具体为什么这样,我也没找出来,有人知道告诉我,或者我查到后再补充上

2.第二个问题

主要原因在于数组变量的地址恰好是第一个元素的地址
        而指针的本身是个地址,再这个地址的内存上,应保存着它要指向元素的地址

1.jpg

Test *p;
Test *two[2] = { new Test(1, 3.2), new Test(5, 9.5) };

p = two[0];
p = *two;  //即可通过编译  让p指向two的第一个元素的地址即可

也就是说  指针p 的地址块上保存的是two[0]的地址,而不是two的地址,two在这里本身就是个指针,它的内存块上保存的是two[0]的地址,所以这里要么直接传Two[0]的地址,要么解引用,解出来Two的内存块的内容即可通过编译

这里你也可以让p = two[1],直接指向第二个元素的地址,也是可以的
2.jpg

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
西瓜小刚 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 23:21:14 | 显示全部楼层
joker11111 发表于 2018-9-20 17:41
1.第一个问题
Test one[2] = { 2, 4 };
Test one[2] = {Test(2),Test(4)};   这两个确实是相等的,

谢谢,解答的可以说很详细了,确实很强大,膜拜
我没搞清楚指针p自己的地址和它存放的地址,所以才没稿明白

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 01:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表