鱼C论坛

 找回密码
 立即注册
查看: 5786|回复: 19

用C++ 输出 double (*pbeans)[2]; 怎么做到

[复制链接]
发表于 2013-7-6 18:44:13 | 显示全部楼层 |阅读模式
1鱼币
用C++ 输出 double (*pbeans)[2];  怎么做到?#include <iostream>


using std::cout;
using std::endl;


int _tmain(int argc, _TCHAR* argv[])
{
        double beans[3][4]={
                                        {1,2,3,4},
                                        {4,3,2,1}
                                        };


        double* pbeans =NULL;
        pbeans=&beans[0][0];

        double (*pbeans)[2];
        cout<<(*pbeans)[2]<<"*(*pbeans)[2]"<<endl;
        return 0;
}


最佳答案

查看完整内容

这个是因为beans这个数组是 beans[3][4] ,这个事这个数组的结构图: 上面的框框存放的是地址,其实二维数组就是一维数组的一维数组啦,beans[3][4]分解开来就是 beans[0] beans[1] beans[2] 这个三个数组里面每个有四个元素啦,你定义的指针(*pbeans)[4] 就说明了每个数组有四个元素的意思,如果换成2 自然无法赋值了,你想想四个元素怎么给只能放两个 元素的空间里放值?对吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 18:44:14 | 显示全部楼层
本帖最后由 格式天下 于 2013-7-7 21:48 编辑

这个是因为beans这个数组是 beans[3][4]  ,这个事这个数组的结构图:
111.JPG
上面的框框存放的是地址,其实二维数组就是一维数组的一维数组啦,beans[3][4]分解开来就是
beans[0] beans[1]  beans[2]  这个三个数组里面每个有四个元素啦,你定义的指针(*pbeans)[4]
就说明了每个数组有四个元素的意思,如果换成2 自然无法赋值了,你想想四个元素怎么给只能放两个
元素的空间里放值?对吧

评分

参与人数 1鱼币 +1 收起 理由
fanki + 1 热爱鱼C^_^ 没错~~就是因为这个,楼主可以看.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 19:38:31 | 显示全部楼层
本帖最后由 只爱你一人 于 2013-7-6 19:50 编辑

呃~又见到二维数组了!
这个输出可以这样
cout<<*(pbeans+0)[1];  //这输出的是第1行第2个元素,因为你这个数组指针(好像是这样叫吧我也晕了)没有被赋值所以不知道行数……
看来我要好好把这几个绕口的玩意给搞明白罗……其实你如果想把指针指向二维数组可以这样
  double (*pbeans)[4]=beans;




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 19:41:14 | 显示全部楼层
首先, double (*pbeans)[2];这句话应该是有问题的,但是我不知道楼主是想干什么。
还有,*pbeans就表示pbeans[0],这个就是beans[0][0],但是楼主在(*pbeans)[2]是表示什么意思呢?从语法角度来说也是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-6 20:20:59 | 显示全部楼层
小号4 发表于 2013-7-6 19:41
首先, double (*pbeans)[2];这句话应该是有问题的,但是我不知道楼主是想干什么。
还有,*pbeans就表示pb ...

书上说合法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-6 20:22:17 | 显示全部楼层
小号4 发表于 2013-7-6 19:41
首先, double (*pbeans)[2];这句话应该是有问题的,但是我不知道楼主是想干什么。
还有,*pbeans就表示pb ...

如果*pbeans 是指向首地址 那这个就是首地址的第3个元素了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 20:55:28 | 显示全部楼层
骗子死全家 发表于 2013-7-6 20:20
书上说合法

这个pbeans上面已经定义成指针了,后面为什么又把它拿来定义数组指针呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 21:19:12 | 显示全部楼层
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
        double beans[3][4]={
                        //地址从0开始                0 1 2 3
                                        {1,2,3,4},
                                                                        //   4 5 6 7  这是一维数组指针所表达的位置,我用pbeans表示
                                        {4,3,2,1}
                };
        double* pbeans =NULL;
        pbeans=&beans[0][0];

                //这是重新定义一个新的变量数组指针,指向一个有四个元素的数组的指针
        double (*pbean)[4] = beans;

                //普通指针输出就像一维数组那样
                cout << pbeans[1] << "   pb1" << endl;
                cout << pbeans[7] << "   pb7" << endl;
                //这是用数组指针输出,因为我pbean是指向首地址,所以是第一个4个元素的数组的第三个数
        cout<< (*pbean)[2] << "     (*pbean)[2]" <<endl;
                //如果要第二个数组的话就(*(pbean + 1))[x],第x+1个 e.g.
                cout << (*(pbean + 1))[1] << endl;
                //括号很重要,会影响到结合顺序所以一定要加,不加的会就不讲解了~~如果你懂了,应该就知道啦,希望对你有用。
        return 0;
}

简单说了一下,希望对你有用。{:7_155:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-7 12:27:31 | 显示全部楼层
  1. #include <iostream>


  2. using std::cout;
  3. using std::endl;


  4. int main()
  5. {
  6.         double beans[3][4]={
  7.                                         {1,2,3,4},
  8.                                         {4,3,2,1}
  9.                                         };


  10.         double (*pbeans)[4];
  11.         //pbeans=&beans[0][0];
  12.                 pbeans = &beans[0];

  13.         //double (*pbeans)[2];
  14.                 cout<<(*pbeans)[2]<<"*(*pbeans)[2]"<<endl;
  15.         return 0;
  16. }
复制代码
这是我在你基础上改的,希望对你有用,看了下,原理和7楼差不多
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-7 13:55:17 | 显示全部楼层
fanki 发表于 2013-7-6 21:19
#include
using namespace std;

我想说 怎么我把 double (*pbean)[4]=beans;
改为double (*pbean)[2]=beans;
//这个数字不是4 是时候 怎么编译不通过?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-7 13:56:19 | 显示全部楼层
格式天下 发表于 2013-7-7 12:27
这是我在你基础上改的,希望对你有用,看了下,原理和7楼差不多

我想说 怎么我把 double (*pbean)[4]=beans;
改为double (*pbean)[2]=beans;
//这个数字不是4 是时候 怎么编译不通过?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-7 19:05:01 | 显示全部楼层
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;

  4. int main() {
  5.         double beans[3][4]={
  6.                 {1,2,3,4},
  7.                 {4,3,2,1}
  8.         };
  9.        
  10.        
  11.         double* pbeans =NULL;
  12.         pbeans=&beans[0][0];
  13.        
  14.         //double (*pbeans)[2];
  15.         double (*p)[4] = reinterpret_cast<double (*)[4]>(pbeans);

  16.         cout<<"(*p)[2]="<<(*p)[2]<<endl;
  17.         return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-7 20:28:29 | 显示全部楼层
本帖最后由 骗子死全家 于 2013-7-7 20:30 编辑

double (*p)[4] = reinterpret_cast<double (*)[4]>(pbeans);

求解    为什么要这样写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-7 21:30:32 | 显示全部楼层
骗子死全家 发表于 2013-7-7 20:28
double (*p)[4] = reinterpret_cast(pbeans);

求解    为什么要这样写

就是指针类型的强制类型转换哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-7 23:10:48 | 显示全部楼层
骗子死全家 发表于 2013-7-7 13:55
我想说 怎么我把 double (*pbean)[4]=beans;
改为double (*pbean)[2]=beans;
//这个数字不是4 是时候  ...

楼主看看14楼的图片啦,应该会明白~~
他解释了,我就不再详细解释了,而且有图,非常好,嘻嘻~~
如果要补充一下的话就是因为你定义的是什么开始
一开始定义的是 一个二维数组    等于    一个一位数组里面有3个元素,每个元素放的是一维数组,有4个元素
所以我定义的是 一个指向数组的指针 指向的是 有4个元素的数组, 而不是两个~~
哎呀~~自己表达不好~~希望你可以明白~~看看14楼的图~~
加油哦~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-7 23:12:26 | 显示全部楼层
骗子死全家 发表于 2013-7-7 13:55
我想说 怎么我把 double (*pbean)[4]=beans;
改为double (*pbean)[2]=beans;
//这个数字不是4 是时候  ...

楼主看看14楼的图片啦,应该会明白~~
他解释了,我就不再详细解释了,而且有图,非常好,嘻嘻~~
如果要补充一下的话就是因为你定义的是什么开始
一开始定义的是 一个二维数组    等于    一个一位数组里面有3个元素,每个元素放的是一维数组,有4个元素
所以我定义的是 一个指向数组的指针 指向的是 有4个元素的数组, 而不是两个~~
哎呀~~自己表达不好~~希望你可以明白~~看看14楼的图~~
加油哦~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-8 08:40:00 | 显示全部楼层
14楼说得很好。其实在我的眼里,没有一维数组,也没有二维数组,只有数组。通常人所说的“一维数组”是指数组元素不是数组的数组;“二维数组”是指数组元素是“一维数组”的数组。最后,可以用以下typedef是代码看得简单些。
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;

  4. typedef double Vec[4];

  5. int main() {
  6.         Vec beans[3]={
  7.                 {1,2,3,4},
  8.                 {4,3,2,1}
  9.         };            
  10.         double* pbeans =NULL;
  11.         pbeans=&beans[0][0];      
  12.         //double (*pbeans)[2];
  13.         Vec* p = reinterpret_cast<Vec*>(pbeans);
  14.         cout<<"(*p)[2]="<<(*p)[2]<<endl;
  15.         return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-8 13:25:39 | 显示全部楼层
格式天下 发表于 2013-7-7 21:47
这个是因为beans这个数组是 beans[3][4]  ,这个事这个数组的结构图:

上面的框框存放的是地址,其实二 ...

原来是这样啊 (*pbeans)【4】 是指 beans的第四个元素
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-8 13:26:58 | 显示全部楼层
fanki 发表于 2013-7-7 23:12
楼主看看14楼的图片啦,应该会明白~~
他解释了,我就不再详细解释了,而且有图,非常好,嘻嘻~~
如果要 ...

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-8 13:28:43 | 显示全部楼层
仰望天上的光 发表于 2013-7-8 08:40
14楼说得很好。其实在我的眼里,没有一维数组,也没有二维数组,只有数组。通常人所说的“一维数组”是指数 ...

终于懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-20 00:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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