深入浅析C/C++语言结构体指针的使用注意事项
短信预约 -IT技能 免费直播动态提醒
主要内容
- 结构体的使用 - 定义,赋值,结构体指针
- 结构体作为函数参数的使用
- 指针的使用
代码内容重点
1.结构体的使用 - 定义,赋值,结构体指针
2.结构体作为函数参数的使用 - 最好使用结构体指针作为参数,而不是结构体
因为当传递的结构体作为参数,数据量较大时,会占用较大的时间与空间,效率很低
使用结构体指针作为函数参数,比用结构体本身作参数效率高很多,当只是读取而不希望修改结构体值时,可以添加const防止改变结构体成员值
(STAFF_T const *p)
3.指针的使用 - 指针的定义,初始化,申请内存空间(malloc),释放(free)
指针在32位系统占用4Byte,在64位系统占用8Byte
注意:
使用malloc申请空间的指针,当不使用后需要手动释放,避免占用内存,并最好重新赋值为NULL,例p = NULL;
malloc后记得判断是否成功
指针的定义和初始化
int* p;
int i;
p = &i;
或者初始化为NULL
int* p = NULL;
C语言代码例子
这C代码在VSCode和GDB online上成功运行调试
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct Staff_t{
char* name;
char sex;
short age;
float salary;
char* date;
} STAFF_T;
void print_msg(STAFF_T const *p); // 结构体指针作为函数参数的使用例子
int main()
{
int size;
//STAFF_T sta; // 定义一个结构体
//staff = &sta; // 另外一种结构体初始化
STAFF_T* staff = NULL; // 定义一个结构体指针,并初始化为NULL;
// 为结构体申请内存空间,需要强制类型转换(这里为结构体指针类型),注意malloc成功返回字节数,失败返回NULL
staff = (STAFF_T*)malloc(sizeof(STAFF_T));
// 判断是否成功申请空间,只有申请成功才能使用,这一步很重要,许多人都容易忘记
if (staff == NULL)
{
printf("malloc(STAFF_T) ERROR\n");
return -1;
}
// 这里几行调试用,打印出在32/64位系统中一些数据类型所占用的内存空间大小不同
size = sizeof(STAFF_T);
printf("STAFF_T size = %d\n",size);
printf("SIZEOF:\n char*:%lu, char:%lu,short:%lu,float:%lu \n",sizeof(char*),sizeof(char),sizeof(short),sizeof(float));
staff->name = (char*)malloc(20*sizeof(char));
// 在C语言中,staff->name以下的两种赋值方式都可以
staff->name = "duruofei";//strcpy(staff->name, "duruofei");
staff->sex = 'M';
staff->age = 29;
staff->salary = 15000;
staff->date = (char*)malloc(20*sizeof(char));
strcpy(staff->date,"2021-12-09");//strcpy(staff->date, "2021-12-09");
// 传递结构体指针
print_msg(staff); // 参数为指针常量,因为这里只是读取staff的值,而不希望修改staff的内容
// 最后释放指针,并赋值为NULL。因为指针free后指针所指向的内存地址可以被其他变量使用,但指针本身还是指向原来地址,还可以使用,防止野指针
free(staff);
staff = NULL;
printf("Hello World\n");
return 0;
}
void print_msg(STAFF_T const *p)
{
// 参数为指针常量,因为这里只是读取p的值,而不希望修改p的内容
if (p == NULL)
{
printf("print_msg: p is NULL\n");
}
printf("Name:%s, Sex:%c, Age:%d, Salary:%0.2f, Date:%s\n",\
p->name, p->sex, p->age, p->salary, p->date);
}
到此这篇关于C/C++语言结构体指针的使用的文章就介绍到这了,更多相关C++结构体内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341