创建动态二维数组,为什么指针前面一定要加*?

cainiao_100 2016-08-10 10:20:24
#include <iostream>
using namespace std;
typedef int* IntArrayPtr;

int main()
{
int d1, d2;
cout << "Enter the row and column demensions of the array:\n";
cin >> d1 >> d2;

IntArrayPtr *m = new IntArrayPtr[d1];
//为什么指针m前面一定要加一个*呢?改成这样:IntArrayPtr m; m = new IntArrayPtr[d1];却不可以?
int i , j;
for (i = 0; i < d1; i++)
m[i] = new int[d2];
cout << "Enter" << d1 << " rows of " << d2 << " integers each:\n";
for(i = 0; i < d1; i++)
for(j = 0; j < d2; j++)
cin >> m[i][j];
cout << "Echoing the 2 dimensional array:\n";
for(i = 0; i < d1; i++)
{
for(j = 0; j < d2; j++)
cout << m[i][j]<< " ";
cout << endl;
}
for(i = 0; i < d1; i++)
delete [] m[i];
delete [] m;
return 0;
}
...全文
645 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wen_eric 2016-08-29
  • 打赏
  • 举报
回复
引用 9 楼 cainiao_100 的回复:
[quote=引用 1 楼 wen_eric 的回复:] 因为new 运算符返回的是一个指针。
你这个回答不准确,new返回的指针没错,按照我后面定义的m也是一个int *类型的指针啊?IntArrayPtr *m = new IntArrayPtr[d1],该怎么解释等号前面的部分呢?难道这样的就是一个二维指针了?[/quote] 我回答这么说只是不想有过多的废话,是你理解的不够深入! 啰嗦一点地说,IntArrayPtr *m;这个变量m的类型是int**型,变量m中存放的数据类型需要是int*型的地址,而new IntArrayPtr[d1]执行的结果正好是int*型变量的数组首地址,因为是int*型变量数组首地址,所以是int**型。这整好是m的类型。因此编译器编译通过。 再说改成这样:IntArrayPtr m; m = new IntArrayPtr[d1];却不可以?这个问题! 这个m是int*型变量。而new IntArrayPtr[d1]执行的结果是int**型,所以将int**型赋值给int*变量m是错误的。 举个例子: int *p = new int; // OK int ** pp = new (int*); // OK int* pp2 = new (int*); // Fault 明白了?
lm_whales 2016-08-26
  • 打赏
  • 举报
回复
和静态数组,不同的是 动态多维数组,可以是连续,也可以是不连续 由 代码编写者决定 只要保证可以用两个下标来访问就可以了 另外,即便分配的内存是连续的二维动态数组, 也不一定就可以直接用a[0],a[1] 来访问了, 多数实现,都还需要再分配一块内存, 储存一级指针a[0],a[1], -------------- 实现上往往第一次, 就分配这些指针的存储空间, 第二次才分配元素的存储空间。 除非用不够灵活的数组指针实现 --------------- 静态数组,C,C++语言可以保证 int a[4][5] ; 这个定义式子定义了二维数组a后。 a[0],a[1],a[2],a[3] 都是有意义的,可以直接访问的
lm_whales 2016-08-26
  • 打赏
  • 举报
回复
指针的指针,称为二级指针。 所谓级(级别),就是经过几次间接(访问) 一级指针,一次间接访问,就可以找到原始数据了 二级指针,要经过两次访问,才能找到。 定义 动态二维数组 -------------- 其实是模仿数组, C,C++本身的数组,是静态数组, 数组中定义的数据是连续存放的 动态数组, 就是仿照静态数组的样子,用一块可以存放连续N 个数据元素的内存块, 当作数组使用, 因为语法上,[] 既可以用于数组,又可以用于指针。 所以,C,C++ 的动态数组,和静态数组,惊人的相似。 ----------------------- 也可以用数组的指针(一级指针),来定义二维数组。 不过显然不如二级指针灵活 所以,通常就用二级指针,来处理。 所谓多维数组,就是用多个下标来访问 数组的元素的数组。 这里的维(度)指的是,需要访问单个元素的(最多)下标个数。 例如 int a[4][5] ;//二维数组, 第一维,4个元素-----这个数组内部,有4个一维数组 ,也就是4个int[5]------, 第二维5个元素-------它的每个 int[5] ,5个元素,也就是5个int------, 一共 4*5 =20个元素,也就是一共20个int; 访问方式 a[i][j] 需要,i,j 两个下标来访问 所以是两维数组。 对于 C,C++,多维数组,就是 数组的数组。 数组,就是连续存放的一批相同类型的数据元素。 这个数据元素,它的类型,可以是内置类型(char,int,float,double 等), 也可以是,结构类型,类类型 等用户定义类型。 也可以是某种类型元素的数组,这种类型。 数组是一种集合类型, 这里的集合,不是数学意义上的集合 ------数学中的集合定义太抽象,太严格---------, 而是堆积在一起的一批数据元素。
paschen 版主 2016-08-26
  • 打赏
  • 举报
回复
引用 10 楼 cainiao_100的回复:
[quote=引用 2 楼 paschen 的回复:] 因为二维数组是一维数组的一维数组,最外一维其实是指向内一维数组的指针,所以要加*
主要是刚学,这种形式头一次见,本身去掉*,m就是一个int类型的指针。加上*是叫二维指针吗?有这种说法吗?[/quote] IntArrayPtr代表的是int*,而不是int
cainiao_100 2016-08-26
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
因为二维数组是一维数组的一维数组,最外一维其实是指向内一维数组的指针,所以要加*
主要是刚学,这种形式头一次见,本身去掉*,m就是一个int类型的指针。加上*是叫二维指针吗?有这种说法吗?
cainiao_100 2016-08-26
  • 打赏
  • 举报
回复
引用 1 楼 wen_eric 的回复:
因为new 运算符返回的是一个指针。
你这个回答不准确,new返回的指针没错,按照我后面定义的m也是一个int *类型的指针啊?IntArrayPtr *m = new IntArrayPtr[d1],该怎么解释等号前面的部分呢?难道这样的就是一个二维指针了?
cainiao_100 2016-08-26
  • 打赏
  • 举报
回复
感谢大家的回复和帮助!
赵4老师 2016-08-26
  • 打赏
  • 举报
回复
Saleayas 2016-08-26
  • 打赏
  • 举报
回复
你的不是二维数组。而是指针的指针。
fengluchaying 2016-08-12
  • 打赏
  • 举报
回复
同意二楼的说法
x独孤求败x 2016-08-11
  • 打赏
  • 举报
回复
二楼对的,在动态二维数组中,这里的new返回的每一个元素都是指向一个一维数组的指针
xguone 2016-08-10
  • 打赏
  • 举报
回复
赞同2楼 赞同2楼
penghuahuijuan 2016-08-10
  • 打赏
  • 举报
回复
因为new会返回一个数据类型对应的指针
赵4老师 2016-08-10
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int **newarr2d(int rows,int cols) {
    int **p,i;

    p=(int **)malloc(rows*sizeof(int *));
    if (NULL==p) exit(1);
    for (i=0;i<rows;i++) {
        p[i]=(int *)malloc(cols*sizeof(int));
        if (NULL==p[i]) exit(1);
    }
    return p;
}
void deletearr2d(int **p,int rows) {
    int i;

    for (i=0;i<rows;i++) {
        free(p[i]);
    }
    free(p);
}
int main() {
    int **arr2d,i,j,r,c;

    r=4;
    c=5;
    //在堆中开辟一个4×5的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    r=6;
    c=3;
    //在堆中开辟一个6×3的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    return 0;
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//  0  1  2
//  3  4  5
//  6  7  8
//  9 10 11
// 12 13 14
// 15 16 17
//
paschen 版主 2016-08-10
  • 打赏
  • 举报
回复
因为二维数组是一维数组的一维数组,最外一维其实是指向内一维数组的指针,所以要加*
wen_eric 2016-08-10
  • 打赏
  • 举报
回复
因为new 运算符返回的是一个指针。
小灸舞 2016-08-10
  • 打赏
  • 举报
回复
因为你new的每个元素都是一维指针, 所以它的返回值是二维指针,所以你要用二维指针接收

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧