结构体指针
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 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )