首页 > 试题广场 >

若有以下语句: int a[4][5],(*p)[5]

[单选题]
若有以下语句:
int a[4][5], (*p)[5];
p = a;
下面表示a数组中元素的是()

  • p+1
  • * (p+3)
  • * (p+1)+3
  • * ( * p+2)
推荐
a是一个二维数组,p是一个指向有5个元素的数组指针。
A:表达式是一个指针,不是对数组元素的引用。*(p+1)等于&a[1],即*(p+1)指向a的第二行的首元素。
B:*(p+3)是一个指针,指向第4行的首元素。
C:*(p+1)指向a的第二行的首元素;*(p+1)+3则指向第二行的第3个元素。
D:* ( *p+2)是对数组元素的正确引用,它等价于a[0][2]。
所以对a数组元素的正确引用的选项是D。
发表于 2018-05-07 10:53:31 回复(7)
首先先明确数组在内存中的排列顺序是一种线性的,“每一行”数据依次在内存中排列。
数组指针int (*p)[5]表示指针变量p指向大小为5的数组对象
数组对象int a[4][5]表示4行顺序排列的大小为5的数组,a表示这个二维数组对象的地址
p=a表示指针变量p指向了这个二维数组对象,p的值也就是这个二维数组对象的首地址,对p进行步长加减计算,相当于指针指向某一行数组对象,也就是表示了这个步长计算的值为某一行数组对象的地址。
例如:p + 1 表示第二行数组对象的地址,*(p + 1)表示得到第二行数组对象,但是一维数组对象的名就是该数组的首地址。
            *(*(p + 1) + N)表示得到该数组中的第N+1个元素的值。
发表于 2018-08-06 22:17:42 回复(0)
此题考查行指针、列指针以及它们的转换,这个帖子整理的比较清晰 https://blog.csdn.net/DYD850804/article/details/80582519
行指针为指向一行元素(多个)的数组指针,例如:a,a+1,a+2,p,p+1......
列指针为指向具体单个)元素的一维指针,例如:a[0],a[1],a[2]......
&列指针--->行指针,*行指针--->列指针

❤下面结合以上分析本题选项:
本题给出的是一个4行5列的数组a,p为指向数组a首行的行指针
A:p+1为指向数组a第2行的行指针;
B:*(p+3)为指向数组a第4行首元素(a[3][0])的列指针,等价列指针表示为a[3];
C:*(p+1)+3为指向数组a第2行第4个元素(a[1][3])的列指针,等价列指针表示为a[1]+3;
D:*(*p+2),其中*p+2为指向数组a第1行第3个元素(a[0][2])的列指针,*(*p+2)即为元素a[0][2]的内容。
以上
发表于 2020-05-20 20:11:18 回复(0)
#include <iostream>
using namespace std;


int main()
{
	int a[4][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
	int (*p)[5];
	p = a;
	cout << "A:" << p+1 << endl;
	cout << "B:" << * (p+3) << endl;
	cout << "C:" << * (p+1)+3 << endl;
	cout << "D:" << * ( * p+2) << endl;
}

发表于 2020-05-13 09:29:55 回复(0)
1. 二维数组的存储按照一维数组执行。
2. 在二维数组中,指针分为行指针与列指针,行指针指向一行,列指针指向某个行中的元素。同一行的不同列元素具有相同的行指针。
    对于数组int a[4][5],a为指向0行的指针,同理a+1,a+2都是指向行的指针,a[0]表示一个具有5个元素的数组,所以a[0]代表指向a[0][0]元素的指针,是一个列指针,同理a[1],a[2]类似,都是指向具体元素的列指针。
3. 行指针的解引用操作可以得到一个列指针(指向首元素),例如*(a+1) = a[1]指向a[1][0],所以元素a[1][0] = *a[1] = *(*(a+1))。
发表于 2021-05-31 11:01:09 回复(1)
解析错了吧 a. p+1 是第二行的起始地址 b. p+3 是第四行起始地址 *(p+3) 就是a[3] 而它是个数组名 也是个地址 第四个数组的首地址,**(p+3) 才是第四行的第一个元素 c. *(p+1) 是a[1] 是个地址 地址加3 是 第3个元素的地址 d. *p+2 第1行的第二个元素的地址 再加个* 那就是a[0][2]
发表于 2023-10-20 11:40:32 回复(0)
a是一个二维数组,p是一个指向有5个元素的数组指针。
A:表达式是一个指针,不是对数组元素的引用。*(p+1)等于&a[1],即*(p+1)指向a的第二行的首元素。
B:*(p+3)是一个指针,指向第4行的首元素。
C:*(p+1)指向a的第二行的首元素;*(p+1)+3则指向第二行的第3个元素。
D:* ( *p+2)是对数组元素的正确引用,它等价于a[0][2]。
所以对a数组元素的正确引用的选项是D。
发表于 2021-09-16 09:32:03 回复(1)
p是一个数字指针,指向一个长度为5的数组,直接在p上偏移就是行,在*p上偏移就是列偏移
发表于 2021-04-14 14:40:21 回复(0)
float fun(int x, int y)
{
    return (x + y);
}
void main()
{
    int a[4][5], (*p)[5];//*p是一个指向5个值数组的指针
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            a[i][j]=i*10+j;
        }
    }
    p = a;  //p指向a的第0行首元素地址
for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cout << *(*(p+i)+j) << endl;//第i行第j列的值
            cout << *(p+i)+j << endl;//第i行第j列的地址

        }
    }
   
}
发表于 2020-03-04 22:43:55 回复(0)
他说的是对a数组元素的引用,a是一个元素个数为4,元素为5个int类型元素数组的数组 
p+1就是对A数组第二个元素的引用,我感觉没什么问题
所以我认为A是正确的,所以我选择屏蔽这道题

发表于 2018-11-17 11:17:53 回复(0)
*p中的p是一个地址,所以*p+2是地址加2然后*(*p+2)为元素
编辑于 2024-04-10 14:22:12 回复(0)
为什么*(p+1)是指向数组a第二行的首元素而不是指向的值

发表于 2023-10-22 15:20:56 回复(0)
首先明确 a是一个二维数组  p 是一个二维数组的指针
那么此时 p表示的是a[0] 的地址 而p+1 表示的是 a[1]的地址
*(p+1) 表示进入该行,在此处表示的是第二行即a[1][0]的地址 , 那么*(P)+1表示的是第二行第二个元素的地址
(*(p)+1) 表示的是第二行第二个元素
因此本题 ABC 表示的都是地址,只有D表示的是元素
发表于 2021-01-07 21:14:25 回复(0)
我对B有疑惑,p+3不是a[0][3]的地址吗,取内容运算后不就是a[0][3]吗?
发表于 2020-07-13 19:41:51 回复(1)
abc地址值,d变量值
发表于 2020-05-16 23:20:01 回复(0)
int (*p)[5]:定义一个数组指针,p=a:数值指针指向整个数组;
重点:
    将*p用b替换,即:*p[5] >b[5],此处p的含义是指向一个有五个元素的数值的首地址,*p才是首地址,也就是指向第一个元素,因此这里的p也就是指向指针的指针,因此要访问对象,需要*(*p);

发表于 2020-03-13 13:41:46 回复(0)
D,数组指针指向数组取值
发表于 2020-03-03 17:53:03 回复(0)
P指向的是一个数组。 对于b,p+3,加了三个数组的内存大小,取出来之后是int[5]数组。 对于c,是在int[5]数组基础上,加了3个int的内存 D选项,才是取出int的值
发表于 2019-08-24 14:03:17 回复(0)
*p是a0地址,**p是a00值,选项c是a13的地址,而不是值
发表于 2019-07-05 19:03:01 回复(0)
首先明确一点,a是二维数组的头地址,int (*p)[5]    指的是数组指针,p是一个指向数组的指针.
发表于 2019-06-14 20:47:48 回复(0)