首页 > 试题广场 >

设有如下定义的链表,则值为7 的表达式是( )?

[不定项选择题]
设有如下定义的链表,则值为7的表达式是()
struct st
{
    int n;
    struct st *next;
} a[3]= {5, &a[1], 7, &a [2], 9, NULL},*p=a;
  • p->n
  • (p->n)++
  • (++p)->n
  • p->next->n
struct st
{
    int n;
    struct st *next;
} a[3]= {{5,&a[1]},{7,&a[2]},{9,NULL}},*p=a;

加个括号更好看一些,属于直接初始化的一种形式,这个题也是巧妙,这种单链表构造方式还是第一次见,可以用p->next访问下一个元素,也可以用p自增访问下一个元素。

发散一下,这种在数组内部实现单链表相比于一般的单链表或者数组有什么好处与应用场景呢?

发表于 2019-09-07 15:36:44 回复(6)
这里如果p=a,那么c选项也对,p=&a和p=a,p的值是相同的,但是指针类型不同,p=&a时候p++等价于p=p+sizeof(a)(这里a是一个指向st类型的不可修改的指针,但是sizeof(a)不等于4而是整个数组的大小),p=a时候p++等价于p=p+sizeof(st)。
发表于 2018-05-08 14:27:45 回复(0)
前提1:
a[3]= {5, &a[1], 7, &a [2], 9, NULL}这里定义了struct st类型的结构体数组,数组里面有三个结构体成员a[0],a[1],a[2],即
a[0]={5,&a[1]}
a[1]={7,&a[2]}
a[2]={9,NULL}
前提2:
*p=a;定义了一个结构体指针,指向结构体a[0]
前提3:
我们需要明白链表存放在数组中,虽然链表是不连续的不能++,--,但是数组是连续存放的,可以自增自减,就比如说二维数组a[2][3]=b[9],为了人更好的理解,可以画成2行3列,但是实质上他们也是线性存放的,即b[3]某种程度上等价于a[1][0]
那么我们再来看选项:
A:p->n                由于指针p指向数组a[0]的首地址,取内容便是5
B:(p->n)++          同A,5++等于6
C:(++p)->n          指针p偏移一个数组单元,指向&a[1],由于&a[1]也是一个指针,指向a[1]的第一个成员,取内容为7,如:p-》【【7】】
D:p->next->n       指针p偏移一个结构体单位,然后取a[1]的第一个成员内容,为7,如:【p-》【7】】
C,D两种内容一样,但所代表的意义不一样
发表于 2022-10-16 16:06:29 回复(1)
这道题存在错误:p=&a;
a是st(*)[3]类型数组,p是st *类型的;
数组名和一级指针级别相同,但是&a就成了二级指针,不可以赋给p!
改成:p = a;
经过VS2015验证,发现C,D都对!
也就是说在这里,p->next和++p没有区别。
编辑于 2018-05-31 09:51:34 回复(2)
struct st
{
    int n;
    struct st *next;
} a[3]= {{5,&a[1]},{7,&a[2]},{9,NULL}},*p=a;
括号一加豁然开朗!
发表于 2022-07-28 15:34:04 回复(0)
看不懂题的我…
发表于 2019-05-20 09:47:36 回复(0)
这个题对着吗?
发表于 2018-05-15 11:46:40 回复(0)
每个元素有一个整数n和一个指向下一个结构体的指针next,p指向a[0]
A.p->n,即指向a[0]的值
B.(p->n)++,对指向a[0]的值进行加一操作,为6
C.(++p)->n,p从指向a[0]变为指向a[1],再取a[1]的值为7
D.p->next->n,a[0]的下一节点为a[1],再取a[1]的值为7

发表于 2024-06-12 22:21:27 回复(0)
一般链表的节点存储是不连续的,这种结构是连续的
编辑于 2023-09-17 14:17:54 回复(0)
这个题出的思路不错,但太过钻营工巧,像是在做高考题,而不是一个工程学科。这个题有几个关键点需要看懂:
1. 首先就是结构体的对象a初始化的方法,这个评论区有很多人已经解释了,加个括号就容易理解,但是工程里这么搞,写完即失业;
2. 第二个是关于C的争议,有人说这是个链表所以不能确定++p指向下一个节点,这就属于被题目误导了,注意看这是一个数组a,它的地址是连续的,不管里面怎么初始化。所以(++p)虽然不符合链表的节点查找,但符合数组的查找。为了验证这个说法,可以测试一下如下代码:(我的环境是Cpp14、clang++,可以证明这个版本的cpp还没有自动推断链表指针的功能)
# include "iostream"

using namespace std;
struct st {
    int n;
    struct st *next;
} a[3] = {5, &a[1], 7, &a[2], 9, NULL}, *p = a;

int main(){
    st * node1 = new st;
    st * node2 = new st;
    st * node3 = new st;

    node1->n=5;
    node1->next=node2;
    node2->n=7;
    node2->next=node3;
    node3->n=9;
    node3->next= nullptr;

    st * p1 = node1;

    cout<<(++p)->n<<endl;
//    cout<<(++p1)->n<<endl;
//    cout<<p->next->n<<endl;
    cout<<p1->next->n<<endl;
}


发表于 2023-07-21 20:20:29 回复(0)
个人感觉答案是D,而不是CD,链表在内存中不是连续的,所以不能使用++p或p++之类的,所以只有D对,不能使用p++这句话是教材上的原话
发表于 2020-04-20 12:02:15 回复(1)
就一个链表 画出来就知道了
发表于 2020-04-13 02:18:42 回复(0)
用的VS2022,改了数组下标结果不报错,不知道为什么。代码如下:
struct st
{
    int n;
    struct st* next;
} a[3] = { 5, &a[1], 7, &a[4], 9, NULL }, * p = a;
//这里a[4]怎么不会报错???
int main(void) {
    cout << (p++)->n << endl;
    cout << (p++)->n << endl;
    cout << (p++)->n << endl;
发表于 2024-05-10 16:35:30 回复(1)
5是常量,不能自加,只有变量可以自加
发表于 2023-06-06 20:21:56 回复(0)
题目没看懂,但是根据运算符优先级判断出C跟D是一回事,直接懵了CD
发表于 2019-08-10 12:29:33 回复(0)
神奇的题目
发表于 2019-06-04 08:49:05 回复(0)