zoukankan      html  css  js  c++  java
  • 结构体指针

    结构体与指针

    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
    ");
    18     printf("
    ");
    19  
    20     //3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,
    21         //p的值为这个结构体的内存空间的地址
    22     printf("s=%ld
    ",s);
    23     s=(struct node *) malloc (sizeof(struct node));
    24     printf("s=%ld
    ",s);
    25     s=(struct node *) malloc (sizeof(struct node));
    26     printf("s=%ld
    ",s);
    27     printf("
    ");
    28  
    29     //4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体
    30         //当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择
    31     t=s;
    32     printf("t=%ld
    ",t);
    33     s->value=1;
    34     printf("s->value=%ld
    ",s->value);
    35     printf("t->value=%ld
    ",t->value);
    36     printf("
    ");
    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
    ",t->value);
    46     printf("Following value=%ld
    ",s->value);
    47     printf("
    ");
    48  
    49     //6.结构体内的某个变量所在的内存单元的地址=结构体所在的内存单元的地址+偏移地址(在结构体中的位置)
    50     printf("%ld
    ",s);
    51     printf("%ld
    ",&(s->value));
    52     printf("%ld
    ",&(s->next));
    53     printf("
    ");
    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
    ",s->next);
    60     printf("t=%ld
    ",t->next);
    61     printf("
    ");
    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
    ");
    18     printf("
    ");
    19  
    20     //3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,
    21         //p的值为这个结构体的内存空间的地址
    22     printf("s=%ld
    ",s);
    23     s=(struct node *) malloc (sizeof(struct node));
    24     printf("s=%ld
    ",s);
    25     s=(struct node *) malloc (sizeof(struct node));
    26     printf("s=%ld
    ",s);
    27     printf("
    ");
    28  
    29     //4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体
    30         //当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择
    31     t=s;
    32     printf("t=%ld
    ",t);
    33     s->value=1;
    34     printf("s->value=%ld
    ",s->value);
    35     printf("t->value=%ld
    ",t->value);
    36     printf("
    ");
    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
    ",t->value);
    46     printf("Following value=%ld
    ",s->value);
    47     printf("
    ");
    48  
    49     //6.结构体内的某个变量所在的内存单元的地址=结构体所在的内存单元的地址+偏移地址(在结构体中的位置)
    50     printf("%ld
    ",s);
    51     printf("%ld
    ",&(s->value));
    52     printf("%ld
    ",&(s->next));
    53     printf("
    ");
    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
    ",s->next);
    60     printf("t=%ld
    ",t->next);
    61     printf("
    ");
    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
    ",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
    ",s->value);

     

     

  • 相关阅读:
    [转]Linux FTP服务配置
    [转]手把手教你nginx下如何增加网站
    [转]linux一键安装web环境全攻略
    CentOS命令
    [转]Response对象的属性和方法
    beforeRouteLeave vue监听返回的使用方法
    ue项目浏览器出现卡顿及崩溃的原因查找与解决方案
    vue中,解决chrome下,的warning, Added nonpassive event listener to a scrollblocking ‘mousewheel‘ event 问题
    npm
    Java线程池使用案例
  • 原文地址:https://www.cnblogs.com/cmyg/p/6910860.html
Copyright © 2011-2022 走看看