*P 和(*P)的差别 用一维数组代替二维数组

本文详细解析了指针与数组的使用方法,包括不同类型的声明方式及其应用场景,如一维和二维数组的动态创建与内存分配等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看下面3种声明方式:
(1)area p[1000];

(2)area *p[1000];

(3)area *p=new area[1000];

第一种方式是声明了一个由1000个area对象组成的数组,数组名叫p.

第二种方式是声明了一个由1000个指向area的指针组成的数组,数组名为p。

第三种方式是声明了一个指针p,该指针指向由1000个area对象组成的一个数组。

 

 

 int *p[3].把数组内容展开,就相当于{地址,地址,地址};

 例子:

int *p=new int [3];

int a[3]={1,2,3};

for(int i=0;i<3;i++)

{

p[i]=a[i];//取每个数组的地址

}

for(int i=0;i<3;i++)

{

cout<<*p<<endl;

*p++;

}

 

 int  (*p)[3]

例子:

   int (*p)[3];

   int  a[3];

   p=&a //取数组的所有地址(不可以写成a,这样只是取得数组的首地址);

   (*p)[0] =1;

   (*p)[1]=2;

   (*p)[2]=3;

for(int i=0;i<3;i++)

{

 cout<<(*p)[i]<<endl;

}

 

动态创建二维数组:

方法一: 用一维数组代替二维数组

 int n,m;

cin>>n>>m;

int *a =new int[n*m];

for(int i=0;i<n;++i)

{

cout<<endl;

 for(int j=0;j<m;++j)

{

    a[i*m+j]=i+j;

cout<<a[i*m+j]<<""<<&a[i*m+j]<<"";

 

}

}

 cout<<endl;

delete []a;

 

运行结果:
0  00491BB0    1  00491BB4     2  00491BB8
1  00491BBC    2  00491BC0     3  00491BC4
2  00491BC8    3  00491BCC     4  00491BD0
各个元素的内存地址是递增的,是在堆区里分配的内存空间。

 

方法二:

方法2:二维数组
  int n,m;
  cin>>n>>m;
  int** a = new int*[n];/////创建指针数组
  for(int i = 0;i<n;i++)
  {
     a[i] = new int[m];////////为每一行分配空间
  }
 
  for(int f =0;f<n;f++)
  {
     for(int j =0;j<m;j++)
  {
     a[f][j] = f+j;////////////为数组赋值
  }
  }


其实大家更关心二维数组在内存中是如何分配空间的:
输出每个元素的地址:
for(int k = 0;k<n;++k)
  {
     cout<<endl;
     for(int s = 0;s<m;++s)
  {
     
   cout<<&a[k][s]<<"  ";
  }
  }

输出结果:
00491B40  00491B44  00491B48
004918D0  004918D4  004918D8
00491890  00491894  00491898

每一行的相邻元素地址是递增的,连续的,不同行之间的地址就不连续了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值