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);

     

     

  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/cmyg/p/6910860.html
Copyright © 2011-2022 走看看