2 sip100105 sip100105 于 2015.06.29 17:02 提问

大神求指导简单C语言问题 刚刚入门

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct _Teacher
{
struct _Teacher *t;
}Teacher;
int main()
{
Teacher teacher1;
Teacher teacher2;
Teacher * head1 = &teacher1;
Teacher * head2 = &teacher2;
printf("\n---原来的地址---\n");
printf("T1%16d\n",&teacher1);
printf("T1.t%16d\n",&teacher1.t);
head1->t = head2;
printf("\n----更改内部指针后的地址-------\n");
printf("H1%16d\n",head1);
printf("H1.t%16d\n",head1->t);
printf("\n--------------------\n");
}
为什么指向结构体Teacher的指针内部的指针可以和Teacher地址不相同;
第一个输出地址是相同的

9个回答

Self_Promotion
Self_Promotion   2015.06.29 23:33
已采纳

看了大家的解答,每个人的理解方式不尽相同,但都是一个意思。

1.指针本身就是一个变量,它的值存放的是一个地址,而指针变量本身也有地址;即对于int *a:a的值和&a的值是不同的。结构体也是一种类型,所以道理是一样的。
printf("H1%16d\n",head1);
printf("H1.t%16d\n",head1->t);
输出的值不同。
Teacher * head1 = &teacher1;
Teacher * head2 = &teacher2;
head1的值是结构体变量teacher1的地址,head2的值是结构体变量teacher2的地址;
head1->t = head2;
那么结构体变量teacher1内部变量t的值就是head2的值,也就是结构体变量teacher2的地址。
现在明白这里输出值为什么不同了吧?就一点:两个值分别是两个结构体变量的地址,肯定不同了。

2.再一点:
printf("T1%16d\n",&teacher1);
printf("T1.t%16d\n",&teacher1.t);
输出值相同。
因为,&teacher1是结构体变量的地址,&teacher1.t是结构体变量内部变量的地址,而这个结构体内部只有一个变量,所以她的地址当然是和结构体变量的地址相同了。倘若,这个结构体内部有好几个变量,那么就不一定。对于这个,你可以参考数组来理解,为什么一个数组的地址和数组里第一个元素的地址相同,就是这个原因。

就以上两点不知你明白不?若还有疑问,可以回复我。希望可以帮到你!

bdmh
bdmh   Ds   Rxr 2015.06.29 17:07

结构体内部对象,那已经是一个新的对象了,为什么要和本身地址一样呢,自己保护自己的指针,这个指针指向新的地址,链表就是这样

sip100105
sip100105 定义一个Teacher对象,里面的指针和Teacher结构体对象地址是一样的,也就是同一个地址,那为什么改变了Teacher内部的指针,结构体变量本省的地址没有变呢?
2 年多之前 回复
baidu_25226775
baidu_25226775   2015.06.29 17:38

你这个结构体可以理解为二级指针,*head1 是一个指向结构体的指针,结构体内部有一个指向同一个结构体的指针。
而第一个为什么一样呢,应该是因为一个teacher1是一个结构体变量,分配内存时是分配到栈里的,结构体里的指针
其实就是结构体的指针,你可以在结构体上加一个变量,它的内存地址就不一样了。

sip100105
sip100105 定义一个Teacher对象,里面的指针和Teacher结构体对象地址是一样的,也就是同一个地址,那为什么改变了Teacher内部的指针,结构体变量本省的地址没有变呢?
2 年多之前 回复
baidu_25226775
baidu_25226775   2015.06.29 17:38

你这个结构体可以理解为二级指针,*head1 是一个指向结构体的指针,结构体内部有一个指向同一个结构体的指针。
而第一个为什么一样呢,应该是因为一个teacher1是一个结构体变量,分配内存时是分配到栈里的,结构体里的指针
其实就是结构体的指针,你可以在结构体上加一个变量,它的内存地址就不一样了。

frank_20080215
frank_20080215   2015.06.29 17:54

Teacher结构体包含的成员是一个指针,指向某一Teacher。
Teacher teacher1;
Teacher teacher2;
... ...
printf("T1%16d\n",&teacher1); -- 取出teacher1的内容,就是成员的值,该值是一个指针。
printf("T1.t%16d\n",&teacher1.t);-- 取出teacher2的数据成员t的值,

u012377333
u012377333   Rxr 2015.06.29 18:10

指向指针的指针,这个意思明白么?

sip100105
sip100105 结构体变量和内部变量地址相同,为什么结构体指针的时候,内部变量就可以不相同了?
2 年多之前 回复
sip100105
sip100105 定义一个Teacher对象,里面的指针和Teacher结构体对象地址是一样的,也就是同一个地址,那为什么改变了Teacher内部的指针,结构体变量本省的地址没有变呢?
2 年多之前 回复
u012565112
u012565112   2015.06.29 21:06

内部指针是int型,分配的空间不一样,所以地址不一样

sip100105
sip100105   2015.06.29 21:21

各位大神,结构体变量和内部变量地址相同,这个可以理解,但为什么指针指向这个结构体变量的时候,指针的地址和结构体变量内部的地址不相同呢?printf("指针的地址:%d-指针内部变量的地址%d",head1,head1->t);head->t地址只有3,为什么?

wuyuehuayiyi
wuyuehuayiyi   2015.10.23 13:30

分享几个CSS运用的技巧。1.使用:not()在菜单上应用/取消应用边框 2.给body添加行高 3.所有一切都垂直居中 4.逗号分隔的列表 5.使用负的nth-child选择项目 6.对图标使用SVG 7.优化显示文本 8.对纯CSS滑块使用max-height 9.继承box-sizing 10.表格单元格等宽 11用Flexbox摆脱外边距的各种hack 12.使用属性选择器用于空链接 http://bbs.369cloud.com/forum.php?mod=viewthread&tid=445&extra=page%3D1 希望能够给你带来帮助

Csdn user default icon
上传中...
上传图片
插入图片