结构体指针

Posted congmingyige

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体指针相关的知识,希望对你有一定的参考价值。

结构体与指针

1.结构体指针的数值为某个结构体的内存空间的地址,从而指针指向某个结构体。

2.结构体指针的初始值为空(0),不指向任何结构体。

3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,p的值为这个结构体的内存空间的地址。

4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体。当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择。

5.当需要存储不同的内容,用到同一个结构体指针时,则需要改变结构体指针的数值,即指向不同的结构体,从而达到使用不同的结构体存储内容的目的,这里要用到malloc和#include<malloc.h>。

6.结构体内的某个变量所在的内存单元的地址=结构体所在的内存单元的地址+偏移地址(在结构体中的位置)。

7.通过结构体指针s内的结构体指针s->next,可以到达另外一个结构体指针t,从而可以访问结构体指针t所指向的结构体。

Code:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <malloc.h>
 4  
 5 struct node
 6 {
 7     long value;
 8     struct node *next;
 9 }*s,*t;
10  
11 int main()
12 {
13     //1.结构体指针的数值为某个结构体的内存空间的地址,从而指针指向某个结构体
14  
15     //2.结构体指针的初始值为空(0),不指向任何结构体
16     if (s==NULL)
17         printf("s=NULL\n");
18     printf("\n");
19  
20     //3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,
21         //p的值为这个结构体的内存空间的地址
22     printf("s=%ld\n",s);
23     s=(struct node *) malloc (sizeof(struct node));
24     printf("s=%ld\n",s);
25     s=(struct node *) malloc (sizeof(struct node));
26     printf("s=%ld\n",s);
27     printf("\n");
28  
29     //4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体
30         //当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择
31     t=s;
32     printf("t=%ld\n",t);
33     s->value=1;
34     printf("s->value=%ld\n",s->value);
35     printf("t->value=%ld\n",t->value);
36     printf("\n");
37  
38     //5.当需要存储不同的内容,用到同一个结构体指针时,则需要改变结构体指针的数值,即指向不同的结构体,
39         //从而达到使用不同的结构体存储内容的目的,这里要用到malloc和#include<malloc.h>
40     s=(struct node *) malloc (sizeof(struct node));
41     s->value=1;
42     t=s;
43     s=(struct node *) malloc (sizeof(struct node));
44     s->value=2;
45     printf("Previous value=%ld\n",t->value);
46     printf("Following value=%ld\n",s->value);
47     printf("\n");
48  
49     //6.结构体内的某个变量所在的内存单元的地址=结构体所在的内存单元的地址+偏移地址(在结构体中的位置)
50     printf("%ld\n",s);
51     printf("%ld\n",&(s->value));
52     printf("%ld\n",&(s->next));
53     printf("\n");
54  
55     //7.通过结构体指针s内的结构体指针s->next,可以到达另外一个结构体指针t,
56         //从而可以访问结构体指针t所指向的结构体
57     t=(struct node *) malloc (sizeof(struct node));
58     s->next=t;
59     printf("s->next=%ld\n",s->next);
60     printf("t=%ld\n",t->next);
61     printf("\n");
62  
63     return 0;
64 }
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <malloc.h>
 4  
 5 struct node
 6 {
 7     long value;
 8     struct node *next;
 9 }*s,*t;
10  
11 int main()
12 {
13     //1.结构体指针的数值为某个结构体的内存空间的地址,从而指针指向某个结构体
14  
15     //2.结构体指针的初始值为空(0),不指向任何结构体
16     if (s==NULL)
17         printf("s=NULL\n");
18     printf("\n");
19  
20     //3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,
21         //p的值为这个结构体的内存空间的地址
22     printf("s=%ld\n",s);
23     s=(struct node *) malloc (sizeof(struct node));
24     printf("s=%ld\n",s);
25     s=(struct node *) malloc (sizeof(struct node));
26     printf("s=%ld\n",s);
27     printf("\n");
28  
29     //4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体
30         //当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择
31     t=s;
32     printf("t=%ld\n",t);
33     s->value=1;
34     printf("s->value=%ld\n",s->value);
35     printf("t->value=%ld\n",t->value);
36     printf("\n");
37  
38     //5.当需要存储不同的内容,用到同一个结构体指针时,则需要改变结构体指针的数值,即指向不同的结构体,
39         //从而达到使用不同的结构体存储内容的目的,这里要用到malloc和#include<malloc.h>
40     s=(struct node *) malloc (sizeof(struct node));
41     s->value=1;
42     t=s;
43     s=(struct node *) malloc (sizeof(struct node));
44     s->value=2;
45     printf("Previous value=%ld\n",t->value);
46     printf("Following value=%ld\n",s->value);
47     printf("\n");
48  
49     //6.结构体内的某个变量所在的内存单元的地址=结构体所在的内存单元的地址+偏移地址(在结构体中的位置)
50     printf("%ld\n",s);
51     printf("%ld\n",&(s->value));
52     printf("%ld\n",&(s->next));
53     printf("\n");
54  
55     //7.通过结构体指针s内的结构体指针s->next,可以到达另外一个结构体指针t,
56         //从而可以访问结构体指针t所指向的结构体
57     t=(struct node *) malloc (sizeof(struct node));
58     s->next=t;
59     printf("s->next=%ld\n",s->next);
60     printf("t=%ld\n",t->next);
61     printf("\n");
62  
63     return 0;
64 }

 

 

 

易错点:

1.创建结构体指针后(初始时结构体指针为空),没有初始化,直接使用。

1 struct node
2 {
3     long value;
4     struct node *next;
5 }*s;
6  
7 s->value=1;

 

 

 

2.使用相同的指针访问结构体,即使用相同的结构体存储数值

 1 struct node
 2 {
 3     long value;
 4     struct node *next;
 5 }*s;
 6  
 7     long i;
 8     s=NULL;
 9     t=(struct node *) malloc (sizeof(struct node));
10     for (i=10;i>=1;i--)
11     {
12         //t=(struct node *) malloc (sizeof(struct node));
13         t->value=i;
14         t->next=s;
15         s=t;
16     }
17     while (s)
18     {
19         printf("%ld ",s->value);
20         s=s->next;
21     }

 

 

如果没使用t=(struct node *) malloc (sizeof(struct node));当i的初始值大于1,则s,t的大小相同(指向同一个结构体),且s->next=s,所以一直输出1,进入死循环。

 

3. 对指针赋值为空后又对指针指向的结构体进行访问或修改

1 struct node
2 {
3     long value;
4     struct node *next;
5 }*s;
6  
7     s=NULL;
8     s->value=1;
9 //    printf("%ld\n",s->value);

 

 

 

4. 释放指针后又对指针进行操作

1 struct node
2 {
3     long value;
4     struct node *next;
5 }*s;
6  
7     free(s);
8 //    s->value=1;
9     printf("%ld\n",s->value);

 

 

 

以上是关于结构体指针的主要内容,如果未能解决你的问题,请参考以下文章

结构体指针数组和结构体数组指针的区别

结构体指针与结构体变量用作函数参数时有啥区别,在用法上

C 语言结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

C语言提高:结构体嵌套一级指针

C语言提高:结构体嵌套一级指针

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )