经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C/C++语言结构体指针的使用
来源:cnblogs  作者:度若飞  时间:2021/12/15 9:06:00  对本文有异议

C/C++语言结构体指针的使用

主要内容

  1. 结构体的使用 - 定义,赋值,结构体指针
  2. 结构体作为函数参数的使用
  3. 指针的使用

代码内容重点

  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上成功运行调试

  1. /******************************************************************************
  2. Welcome to GDB Online.
  3. GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
  4. C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
  5. Code, Compile, Run and Debug online from anywhere in world.
  6. *******************************************************************************/
  7. #include <stdio.h>
  8. #include <malloc.h>
  9. #include <string.h>
  10. typedef struct Staff_t{
  11. char* name;
  12. char sex;
  13. short age;
  14. float salary;
  15. char* date;
  16. } STAFF_T;
  17. void print_msg(STAFF_T const *p); // 结构体指针作为函数参数的使用例子
  18. int main()
  19. {
  20. int size;
  21. //STAFF_T sta; // 定义一个结构体
  22. //staff = &sta; // 另外一种结构体初始化
  23. STAFF_T* staff = NULL; // 定义一个结构体指针,并初始化为NULL;
  24. // 为结构体申请内存空间,需要强制类型转换(这里为结构体指针类型),注意malloc成功返回字节数,失败返回NULL
  25. staff = (STAFF_T*)malloc(sizeof(STAFF_T));
  26. // 判断是否成功申请空间,只有申请成功才能使用,这一步很重要,许多人都容易忘记
  27. if (staff == NULL)
  28. {
  29. printf("malloc(STAFF_T) ERROR\n");
  30. return -1;
  31. }
  32. // 这里几行调试用,打印出在32/64位系统中一些数据类型所占用的内存空间大小不同
  33. size = sizeof(STAFF_T);
  34. printf("STAFF_T size = %d\n",size);
  35. printf("SIZEOF:\n char*:%lu, char:%lu,short:%lu,float:%lu \n",sizeof(char*),sizeof(char),sizeof(short),sizeof(float));
  36. staff->name = (char*)malloc(20*sizeof(char));
  37. // 在C语言中,staff->name以下的两种赋值方式都可以
  38. staff->name = "duruofei";//strcpy(staff->name, "duruofei");
  39. staff->sex = 'M';
  40. staff->age = 29;
  41. staff->salary = 15000;
  42. staff->date = (char*)malloc(20*sizeof(char));
  43. strcpy(staff->date,"2021-12-09");//strcpy(staff->date, "2021-12-09");
  44. // 传递结构体指针
  45. print_msg(staff); // 参数为指针常量,因为这里只是读取staff的值,而不希望修改staff的内容
  46. // 最后释放指针,并赋值为NULL。因为指针free后指针所指向的内存地址可以被其他变量使用,但指针本身还是指向原来地址,还可以使用,防止野指针
  47. free(staff);
  48. staff = NULL;
  49. printf("Hello World\n");
  50. return 0;
  51. }
  52. /**
  53. * function: print_msg
  54. * input: STAFF_T const *
  55. * ouput: none
  56. * descreption: print massage
  57. */
  58. void print_msg(STAFF_T const *p)
  59. {
  60. // 参数为指针常量,因为这里只是读取p的值,而不希望修改p的内容
  61. if (p == NULL)
  62. {
  63. printf("print_msg: p is NULL\n");
  64. }
  65. printf("Name:%s, Sex:%c, Age:%d, Salary:%0.2f, Date:%s\n", p->name, p->sex, p->age, p->salary, p->date);
  66. }

原文链接:http://www.cnblogs.com/duruofei/p/15670942.html

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号