首页 > 试题广场 >

下面程序的输出结果是() #include...

[单选题]
下面程序的输出结果是()
#include<iostream.h>
void main(){
	int n[][3] = {10,20,30,40,50,60};
	int (*p)[3];
	p=n;
	cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
}
  • 10,30,50
  • 10,20,30
  • 20,40,60
  • 10,30,60
int (*p)[3];
这里首先确定:p是一个指针,一个指向数组的指针。
p = &(p[0])       p是二维指针
p[0] = &(p[0][0]) p[0]是一维指针

p[0] + 1表示在列上移动。  e.g:  p[0] + 1 = &p[0][0] + 1 = &p[0][1]
p + 1   表示在行上移动。  e.g: p + 1 = &(p[0]) + 1 = &p[1]

因此:
*(p[0]+1) = p[0][1] = 20
(*p)[2] = p[0][2] = 30
发表于 2016-03-25 01:32:11 回复(0)
p[0]表示第一行的地址,p[0]+1表示第一行首地址偏移一个地址,即a[0][1]。
int (*p)[3],p是一个数组指针,指向三个元素为一个数组的指针,(*p)表示第一行,(*p)[2]表示a[0][2]
发表于 2016-03-24 15:03:11 回复(2)
先来分析第一个语句:n[][3],这表示一个二维数组,一行有三个数,所以这个数组有两行,n 即为 n+0,表示一个数组指针,它指向了这个二维数组第一行的这个一维数组 第二个语句:它定义了一个数组指针p,它指向一个含有三个元素的数组;那么*p即*p+0,则指向了这个数组的第一个元素的地址 第三个语句:很显然由前面的分析,p指向二维数组的第一行这个一维数组;*p可以为*(p+0)指向了第一行的首地址,也可以为*(p+0)+0指向了n[0][0]这个元素的地址,那么*(*(p+0)+0)即p[0][0]就等于n[0][0]; p[0]就是*(p+0),那么p[0]+1就是*(p+0)+1, 而*(p+0)+1就是二维数组第一行第二个元素的地址,所以*(*(p+0)+1)就等于n[0][1]; (*p)[2]就是*(p+0)[2]也就是*(*(p+0)+2)即p[0][2] == n[0][2]; 如果想要指向n的第二行,那么就是p+1,*(p+1)就指向第二行的第一个元素即&40
编辑于 2016-08-07 13:48:22 回复(0)
int n[][3] = {10,20,30,40,50,60}; int(*p)[3];
 ()和 []都是括号运算符,同属于第一级,结合顺序从左到右,先与谁结合,本质就是什么,这里先和*结合,本质就是指针,因此(*p)[3]构成数组指针。(加个的字会更好理解,数组的指针,即本质上是指针,指向数组),同理去理解指针数组(加个的字,指针的数组,本质是数组,如*p[3], []优先级高,先和p结合成p[3],即先和谁结合本质就是什么,方便理解记忆)
   p既然是指向数组的指针,那么在二维数组中怎么用p表示元素呢 :
   p[0]+i 表示在列上的移动 i 列
   p[0+i] 表示在行上移动 i 行

发表于 2018-12-06 15:47:04 回复(0)

当程序使用***数组的名字时,也会自动的转换其指向数组首元素的指针。实际上是指向第一个内层数组的指针


int ia[3][3]={{1,2,3},{4,5,6},{7,8,9}};

int(*p)[3]=ia;  //p是int(*)[3]型,是一个指向具有三个元素的一维数组指针。

P=&ia[2];//p指向了ia的尾元素


1、     内存结构


二维数组在内存中的存放形态不是矩阵。

发表于 2018-03-07 21:25:30 回复(0)
p[0]+1表示在列上移动,p+1表示在行上移动。
发表于 2017-05-16 11:44:11 回复(0)
直接在p上偏移就是行,在*p上偏移就是列
比如**(p+1)等于40 即p[1][0];
*(*p+1)等于20 即p[0][1];
其中*q=q[0]
*q+1=q[1]
发表于 2016-03-24 15:16:57 回复(0)
举例说明: 一维数组a【4】,怎么看待这个东西,数组名a,他里面存的是一个特殊值,地址,谁的地址,a【0】【0】的地址。即*a==a【0】【0】;a+1指向a【1】等等 ; 二维数组a【3】【4】,怎么看待这个东西,我们可以看成3个一维数组,数组名分别为a【0】,a【1】,a【2】,既然都是数组名,类比一维数组,那他们的值都是一个地址,分别指向各自的一维数组的首元素,即*a【0】==a【0】【0】,a【0】+1指向a【0】【1】等等,*a【1】==a【1】【0】,a【1】+1指向a【1】【1】等等,*a【2】=a【2】【0】,a【2】+1指向a【2】【1】等等。都是在行内移动(平行移动)。 那数组名a又是什么东西呢?a是3个特殊元素a【0】,a【1】,a【2】的数组名。即a数组里面有三个元素a【0】,a【1】,a【2】,我们知道,数组名里面存放的是数组首元素的地址,即a的值指向a【0】,也即*a=a【0】那a+1指向a【1】等等a+1是在行间移动(垂直方向)。其实a是个双指针,也可以叫行指针(这就是为什么题目中可以把n赋值个一个行指针p的原因,无论n+1还是p+1都是移动一行,而不是一个元素),他自己的值是个地址,他指向的值还是个地址。
编辑于 2019-10-13 01:02:58 回复(0)
(*p)[2]=*(p+0)[2]=p[0][2]
发表于 2019-09-24 16:47:48 回复(0)
可以对cout里面的语句进行一个等价的替换:
*(p[0]+1) ------->>>>>p[0][1]
(*p)[2] ---------->>>>>>p[0][2]
这样答案就一目了然了。。。。
发表于 2017-11-08 19:40:52 回复(0)
p[0]+1=p[0][1]; p+1=p[1].
编辑于 2017-08-11 14:06:32 回复(0)
很棒的题目,很好的考察了指针和指向数组的指针(二维指针)
发表于 2017-08-04 23:24:19 回复(0)
并不是很懂C++的问个问题,int n[][3] = {10,20,30,40,50,60};是不是代表n的行数是2, 那么int (*p)[3];的话,p[3]是指向的第几行啊
发表于 2016-09-06 10:21:46 回复(1)
C++ 中还能可以用 “count” 输出吗 
发表于 2016-04-08 10:55:28 回复(1)