user-0 提问: 为什么将p=p->next 改为p++会报错？？

回复:
user: user-1
content: 引用 9 楼 均陵鼠侠 的回复:感谢夸奖，哈哈！不过我还是中意我的《C语言非常道》，《标准C语言指南》太辞典化了。 个人感觉不同吧，没觉得《标准C语言指南》太辞典化，比原版标准好读多了 市面上只有你的《标准C语言指南》和Guy L. Steele Jr.的《C语言参考手册(原书第5版)》对原版标准有自己的诠释 有空再拜读你的《C语言非常道》

user: user-1
content: [quote=引用 9 楼 均陵鼠侠 的回复: 感谢夸奖，哈哈！不过我还是中意我的《C语言非常道》，《标准C语言指南》太辞典化了。[/quote] 个人感觉不同吧，没觉得《标准C语言指南》太辞典化，比原版标准好读多了 市面上只有你的《标准C语言指南》和Guy L. Steele Jr.的《C语言参考手册(原书第5版)》对原版标准有自己的诠释 有空再拜读你的《C语言非常道》，

user: user-2
content: 引用 7 楼 Intel0011 的回复:[quote=引用 6 楼 均陵鼠侠 的回复:][quote=引用 5 楼 Intel0011 的回复:][quote=引用 4 楼 Intel0011 的回复:]简单来讲，就是p指向的是结构，是聚合，不是标量，所以p++非法，后缀运算符++要求操作数是标量 更正一下： 后缀运算符++要求操作数是实数类型或是指针类型 结构是聚合类型，所以p++非法 标量还包含了复数类型，而复数类型参与运算符++时，会自动进行实数-复数转换 [/quote]  指针类型是标量。请参照这幅图，确认你对标量的理解是正确的。另外，p是指针，p ++ 是没有问题的。 [/quote] 的确我看错了，p是指针，是标量 P.S.  均陵鼠侠，你的《标准C语言指南》非常赞 [/quote]  感谢夸奖，哈哈！不过我还是中意我的《C语言非常道》，《标准C语言指南》太辞典化了。

user: user-1
content: 均陵鼠侠，你的《标准C语言指南》的勘误在哪里，你的网站上没发现

user: user-1
content: 引用 6 楼 均陵鼠侠 的回复:[quote=引用 5 楼 Intel0011 的回复:][quote=引用 4 楼 Intel0011 的回复:]简单来讲，就是p指向的是结构，是聚合，不是标量，所以p++非法，后缀运算符++要求操作数是标量 更正一下： 后缀运算符++要求操作数是实数类型或是指针类型 结构是聚合类型，所以p++非法 标量还包含了复数类型，而复数类型参与运算符++时，会自动进行实数-复数转换 [/quote]  指针类型是标量。请参照这幅图，确认你对标量的理解是正确的。另外，p是指针，p ++ 是没有问题的。 [/quote] 的确我看错了，p是指针，是标量 P.S.  均陵鼠侠，你的《标准C语言指南》非常赞

user: user-2
content: 引用 5 楼 Intel0011 的回复:[quote=引用 4 楼 Intel0011 的回复:]简单来讲，就是p指向的是结构，是聚合，不是标量，所以p++非法，后缀运算符++要求操作数是标量 更正一下： 后缀运算符++要求操作数是实数类型或是指针类型 结构是聚合类型，所以p++非法 标量还包含了复数类型，而复数类型参与运算符++时，会自动进行实数-复数转换 [/quote]  指针类型是标量。请参照这幅图，确认你对标量的理解是正确的。另外，p是指针，p ++ 是没有问题的。

user: user-1
content: 引用 4 楼 Intel0011 的回复:简单来讲，就是p指向的是结构，是聚合，不是标量，所以p++非法，后缀运算符++要求操作数是标量 更正一下： 后缀运算符++要求操作数是实数类型或是指针类型 结构是聚合类型，所以p++非法 标量还包含了复数类型，而复数类型参与运算符++时，会自动进行实数-复数转换

user: user-1
content: 简单来讲，就是p指向的是结构，是聚合，不是标量，所以p++非法，后缀运算符++要求操作数是标量

user: user-2
content: 谢邀。 其实代码不用全发出来，只发一点点就足够了。 首先，你要明白链表是怎么回事。想象一下，如果把struct student看成家庭，那么，指针变量p的值指向一个家庭 a，家庭的成员next知道另一个家庭 b。这样的话，如果变量p一开始指向家庭a，那么，p = p->next就使得变量p指向家庭 b。这里的关键是，家庭a和b可能不在一起，相距很远，位置不确定，但是它们可以通过家庭的成员next彼此建立关联。 再来看表达式 p ++。如果 p 的类型是 T，那么，p++等价于 p = p + sizeof (T)，或者说，p = p + sizeof p。就是说，在p原来的基础上，再加上p的大小，或者p的类型的大小。显然，p++的结果是指向p后面的内存位置。所以p ++ 要求所有“家庭”必须是连续的、紧邻的。

user: user-0
content: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define N 3 struct student { 	int num; 	char name[50]; 	char sex; 	int age; 	struct student* next; }; void input(struct student* stu) { 	struct student* p; 	int i=0; 	for (p = stu; p < stu + N; p++,i++) 	{ 		printf("第%d位:", i + 1); 		scanf("%d %s %c %d", &p->num, p->name, &p->sex, &p->age); 		i == N - 1 ? (stu[i].next = NULL) : (stu[i].next = &stu[i + 1]); 	} } void print(struct student *stu) { 	struct student *p; 	for (p = stu; p->next!=NULL; p=p->next); 	{ 		printf("%d %s %c %d", p->num, p->name, p->sex, p->age); 	} } struct student* del(struct student* stu,int n) { 	struct student* p,*head; 	for (p = stu,head=p; p != NULL;p=p->next) 	{ 		if (p->age == n) 		{ 			if (p == head) 			{ 				head = p->next; 			} 			else if (p->next == NULL) 			{ 				(p - 1)->next = NULL; 			} 			else 			{ 				(p - 1)->next = p + 1; 			} 		} 	} 	return head; } int main() { 	int n; 	struct student stu[3]; 	printf("请依次输入 学号 姓名 性别 年龄：\n"); 	input(stu); 	printf("请输入一个年龄：\n"); 	scanf("%d", &n); 	print(del(stu,n)); }

user: user-0
content: 代码被挡了。。我重新发