首页 > 试题广场 >

若有以下定义和赋值语句,则与&s[i][j]等价的是?

[单选题]
若有以下定义和赋值语句,则与&s[i][j]等价的是()
int s[2][3] = {0}, (*p)[3], i, j;
p = s;
i = j = 1;

  • *(*(p+i)+j)
  • *(p[i]+j)
  • *(p+i)+j
  • (*(p+i))[j]
推荐
int (*p)[3]可以看出p是数组的指针,p=*s说明p指向的是s[0]数组。[]符号的优先级高于&符号,&s[i][j]是s[i][j]的地址。*(p + i) + j与&s[i][j]等价。
编辑于 2015-01-31 10:13:27 回复(0)
int (*p)[3] 表示一个指针,指向一个含有三个元素的数组;
p=s,表示p指向了数组s的第一行,
p+1 表示现在指针指向了数组s的第二行;
*(p+1)表示数组s第二行第一个元素的地址;
*(p+1)+1 表示数组s第二行第二个元素的地址;
发表于 2015-04-29 14:25:46 回复(6)
ints[2][3] = {0}  ————> s为二维数组
(*p)[3]    ————> 数组指针(p是个指针,指向一个长度为3的数组,每个元素是int型)
 p = s       ————> p指向的是s的第一行的首元素的地址
   *(p+i) 等价于 s[i]
   *(p[i]+j) 等价于 *(*(p+i)+j) 等价于 s[i][j]
    p[i]+j ==> *(p+i)+j ==> &s[i][j]
编辑于 2016-03-12 10:39:15 回复(5)
其实一眼可以看出来,只有C选项表示地址 ,而其余三个选项都表示值(为0).
发表于 2015-09-13 20:37:12 回复(1)
答案:C
这里p是数组指针,指向长度为3的数组,初始化指向s
P+i代表p指针向后移动i个长度为3的int数组的大小。
*(p+i)+j,表示p+i 指针再向后移动j个int长度。也就是&s[i][j]
发表于 2015-01-28 15:51:39 回复(1)
已知s[i][j] = *(*(s+i)+j),p = s,那么&s[i][j] = *(s+i)+j = *(p+i)+j。

编辑于 2020-07-19 14:52:11 回复(1)
s[2][3]]表示为大小为2的数组,其中每个元素是含有3个元素的数组即数组的数组,int  (*p)[3]是指指针p指向一个数组(数组含有3个整型元素)。p = s;表示指针p指向s[2][3]的首元素即第一个数组(总共2个),p+1表示指针p指向s[2][3]的第二个元素仍是指针(指针加减某个整数仍是指针)。*(p+1)为解引用表示含有3个元素的数组。数组名自动转换成指向该数组首元素的指针(*(p+1)与p[1]等价),*(p+1)还是个指针,
*(p+1)+j也是指针,指向数组s的第二个元素(数组)的第j个元素即为&s[i][j]的地址。
编辑于 2018-04-26 19:54:35 回复(0)
*和[]的个数之和为2表示值 之和为1表示地址(这话你们听过没有 我在书上看的)
发表于 2019-01-21 23:19:42 回复(0)
原来是地址 审题又错了
发表于 2016-06-07 07:27:44 回复(1)
1. 二维数组 
    int s[2][3] 是 2 行 3列 .  我们经常说行列式,  所以s[2][3] 就是  行---> 2,   列--->3.   本质是c语言中内存数据按行存储.
2. 数组指针
    (a) 既然是数组指针那么它本质是指针...   所以要用括号,即用最高优先级的符号来表征它的本质.   int           (*p)[3]  就是指向 int [3] 的数组的指针.    同样的逻辑可以理解 指针数组  int *p[3].
    (b) p+1 是什么呢?  先搞清p是啥. p 是 int(*)[3]类型的变量,  指向数组地址的指针,那么 *p表示取它的值, 即取出指向的这个数组地址. 则 *p 就是 int* 类型....  为啥? 因为int K[3]; int *arr = K; 数组地址就是int*类型.   好了,那么这里就很清晰了. **p 才是p指向的那个数据.
3. &s[i][j]
这个东西表示的是取s[i][j]这个元素的地址..  那么根据2-(b)中可以知道 *(p + i) 是行i的数组地址,那么从这一行往后遍历即   (*(p+i) +j) 这个得到了 i, j 元素的地址, 是int* 类型.  就是和&s[i][j]相等.  所以答案为c.
那D   (*(p+i))[j] 表示啥呢?  *(p+i)表示行i的数组首地址了而且是int*类型,那么就好比数组一样了用中括号表示 具体的那个值了.  即s[i][j]. 和A答案一样. 
B答案 *(p[i]+j) 中 p[i]表示行i数组地址,  偏移j,再取地址,就是数据本身了


发表于 2020-02-24 17:46:27 回复(0)
这么想,[],*记为正1,&记为负1,题干中是-1+1+1为1,ABD都是2,只有C是1
发表于 2018-04-10 21:05:58 回复(0)
又头晕了 
发表于 2015-01-11 17:27:06 回复(1)
已知s[i][j] = *(*(s+i)+j),p = s,那么&s[i][j] = *(s+i)+j = *(p+i)+j。
发表于 2024-05-08 15:15:16 回复(0)
问是否等价的问题时,考虑以下:
1.是指针还是元素
1.1若是元素,则考虑类型是否一致
1.2.若是指针,则考虑指向的内存空间存储的内容是否类型一致

本题:
&s[i][j]-->这是一个元素的指针(地址)
A.*(*(p+i)+j) -->这是一个元素表示为p[i][j]
B.*(p[i]+j)-->本质上和A一样,因为p[i]的本质就是*(p+i),表示为第i行的数组名,既为第i行第0列的元素的首地址
C.*(p+i)+j-->就等于&p[i][j],符合题意
D.(*(p+i))[j]-->若视为(p[i])[j],这表示元素和p[i][j]无区别
编辑于 2024-03-17 12:04:49 回复(0)
不是一个二级指针?
发表于 2023-08-02 09:49:28 回复(0)
这是求它的地址不是值
发表于 2019-10-26 18:05:55 回复(0)
定义的:int (*p)[3];是一个数组指针,里头存放了三个指针:p[0]、p[1]、p[2]。
              首先,p数组名是个指针,指向整个数组的首地址。p+1 = 下一个3个元素的数组首地址,p+2 = 下下一个3个元素的数组首地址。
              *p = p[0],为p[0]这个指针,*(p+1) = p[1],为p[1]这个指针。


因为,p = s ,s[][3]为二维数组,所以p指向了s首行的首地址;
所以,p + i → 为s的第i行的首地址;
*(p + i) → 原本为下下i个的3个元素数组的第一个元素p[0]指针 , 为s的第i行的首元素的地址;
*(p + i) + j → a + j  ,表示第j个元素地址,即a[i][j]
编辑于 2019-03-24 11:57:37 回复(0)
看漏一个&
发表于 2018-06-28 23:22:51 回复(0)
*在这里不再指代元素,而是地址
发表于 2017-11-06 07:56:02 回复(0)
p是一个指针,指向长度为3类型为int的一维数组 p+i时,跳过的距离为长度为三的数组,恰好是s一行的距离 解引用p+i指向了第i行的0号元素 再+j 即向后跳j个元素 就是&s[i][j]
编辑于 2017-03-04 10:01:38 回复(0)
注意读题。题目问的是地址。
发表于 2016-05-26 19:48:30 回复(0)