结构体指针

Posted SmartGame

tags:

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

  今天我们来说一说结构体指针,真如同前面讲过的结构体也是一种数据类型,既然是数据类型就可以通过它来定义指针变量,代码如下:

  

 1 #define _CRT_SECURE_NO_WARNINGS//一个warning,阻止对不安全函数的警告
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 
 6 typedef struct List//首先定义一个结构数据类型//这时是没有分配内存空间的
 7 {
 8     int a;
 9     char name[32];
10 }List;
11 
12 void main()
13 {
14     List L1;//定义一个List类型的变量,这里分配了内存空间
15     List *L2 = NULL;//定义一个List类型的指针变量,它只有4个字节
16     L1.a = 23;
17     strcpy(L1.name,"name");//数据拷贝到name里
18 
19     //我们知道可以通过指针来操作变量,将地址传递给指针
20     L2 = &L1;
21     //可以通过指针来操作内存空间
22 
23     printf("%d \n",sizeof(L2));//指针的空间大小是 4 个字节不管是什么指针都是四个字节
24     printf("%d \n",L2->a);//23
25     printf("%s \n",L2->name);//name
26 
27 
28     system("pause");
29     return;
30 }

  然后我们可以看到用List类型定义的指针可以指向List类型的变量,即什么类型的指针可以操作什么类型的变量空间;我们可以看到结构体指针的寻标符是 -> ,寻标符没有太多的意义,可以理解为:寻标符,寻标符寻找到目标的符号;

  那么可不可以像普通的指针一样,可以自定义的分配内存空间呢?

 1 List* distribution2()
 2 {
 3     List *L = NULL;//定义一个指针变量
 4     L = (List*)malloc(sizeof(List));//在堆区为其分配空间//由于是手工分配的,所以如果不主动释放掉的话,会一直占着资源直到整个程序结束
5 L->a = 10; 6 strcpy(L->name,"name2"); 7 printf("L:%d\n",L);//L所指向的地址 8 printf("&L->a:%d\n",&L->a);//头元素的地址 9 return L; 10 11 } 12 13 void main() 14 { 15 16 List *L = NULL; 17 List L1; 18 printf("&L1:%d\n",&L1);//L1的地址 19 printf("&L1.a:%d\n",&L1.a);//L1头元素的地址 20 21 L = distribution2();//用L来接受传递回来的地址 22 printf("%d \n",L->a);//10 23 printf("%s \n",L->name);//name2 24 system("pause"); 25 }

 

  同样我们发现与基本的数据类型一样,同样可以为结构体指针自定义的分配内存空间,并且不会被自动析构掉;与普通的指针差别不大;

  同样我们发现不管是普通变量还是指针变量,他们分配的地址和头元素的地址是一样的;也就是说找到头元素的地址就找到了分配的内存地址;

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

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

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

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

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

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

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