结构体指针

结构体与指针

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);
时间: 2024-10-10 04:44:28

结构体指针的相关文章

C语言 结构体指针赋值 incompatible types when assigning to type &#39;char[20]&#39; from type &#39;char *&#39;

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

(C)struct结构体指针

结构体指针 指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员:其二是指向结构的指针(称为结构指针). 前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点. 结构指针说明的一般形式是: struct (结构类型名称) * (结构指针变量名);例如:struct date * pdate, today;说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量. 语句: struct date{ int year; int mo

c语言中结构体指针

1.指向结构体的指针变量: C 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向运算符"->". 举例说明: struct SunLL { int a; int b; int c; }; struct SunLL  * p;               //定义结构体指针 struct SunLL A = {1,2,3};    //定义一个SunLL类型的变量A

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

结构体指针之 段错误 具体解释(segmentation fault)

一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这个编译没有问题,可是执行是段错误    Segmentation fault 由于你定义了一个结构体指针p.用来指向此类

用PostMessage或SendMessage发送结构体指针

SendMessage可以随意发送结构体指针. PostMessage则必须注意结构体的生命周期. 例如如下发送代码,使用PostMessage: struct _tag_aa { CString s1; char szBuffer[512]; int a; char* szText; }; _tag_aa *a=new _tag_aa; a->s1="ssssss11111111111111"; strcpy(a->szBuffer,"Bufferrrrrrrr

c语言中的结构体指针类型的cast

1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针,并且 在这个结构体中,第一个结构成员必须也是一个结构体(最好是结构体类型). 那么我们可以这个结构体指针转换为指向这个结构体中第一个成员结构体的指针. 直接看代码: ************************************ /* struct transform for struct

python 传递结构体指针到 c++ dll

CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED xxx.cpp) xxx.cpp #include <iostream> using namespace std; // c++ 结构体定义 struct struck_ { // 股票名,字符串 char * stock_code_; // 开盘价 double stock_open_; };

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};