C\C++ 学习笔记
关于p++ ->a,(p++)->a,++p->a,(++p)->a
心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
关于p++ ->a,(p++)->a,++p->a,(++p)->a
注意:
1.->的优先级比++高,所以p++->a
即取指针p指向a的值,输出后指针p自增1,而++p->a
相当于++(p->a)
。即取指针p指向的a值,再给a自增1。
2.()和->同级,根据从左至右的运算规则,(p++)->a
即取指针p指向a的值,输出后p自增1,相当于p++->a
,而(++p)->a
即先给指针p自增1,然后取增1后的指针值指向所指向的目标a的值。
实践代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
struct table {
int x, y;
}a[4]={{10,20},{30,40},{50,60},{70,80}};
struct table* p = a;
printf("%d\n", p++->x);
printf("%d\n", ++p->y);
printf("%d",(a+3)->x);
}
实践结果:
第一次输出,取指针p指向a[0]的x值,输出后指针p再自增1并指向a[1]。符合条件
第二次输出,先取指针p指向a[1]的y值,然后y值自增1,再输出。 符合条件
第三次输出,先取结构体中第四个元素a[3]即a[0+3]的地址,再取a[3]指向x的值。符合条件
总结一下,其实就是结构体指针中“++”,“->“,”()"优先级的问题。
例题:
设有以下程序段,则值为6的表达式是()
struct st{
int n;
struct st*next;
};
static struct a[3]={5,&a[1],7,&a[2],9,0},*p;
p=&a[0];
A.p++ ->n B.++p->n C.p->n++ D.(*p).n++
答案:B
解析:A答案中指针p指向a[0]的n值5,所以A表达式的值为5,A。
B答案中指针p先指向a[0]的n值5,然后n值自增1,所以B表达式的值为6。
C答案中指针p指向a[0]的n值5,所以C表达式的值为5,C。
D答案中因为p=&a[0],所以即取结构体的a[0]的n值5,所以D表达式的值为5,D。
心有猛虎,细嗅蔷薇。再见了朋友~