• 【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员


    6.5结构体指针变量

    结构体的指针变量:本质是变量只是该变量保存的是结构体变量的地址


    6.5.1结构体指针变量的定义

    通过指针,可以访问到我们结构体变量的值

    可以通过   ->  符号  访问到结构体变量 


    6.5.2 结构体数组元素的指针变量

    指针变量保存结构体数组元素的地址

    1. struct Student7 {
    2. int num;
    3. char name[20];
    4. };
    5. void inputStuArr(Student7 *arr,int n){
    6. cout<<"请输入"<<n<<"个学员信息(num,name)"<<endl;
    7. for(int i = 0;i<n;i++){
    8. //注意数组的每个元素是结构体变量
    9. cin >> (arr + i)->num >> (arr + i)->name;
    10. }
    11. }
    12. void sortStuArray(Student7 *arr,int n){
    13. // for(int i = 0;i<n;i++){
    14. // for(int j = 0;j<n-i-1;j++){
    15. // if((arr+j)->num > (arr+j+1)->num){
    16. // Student7 temp = *(arr+j);
    17. // *(arr+j) = *(arr+j+1);
    18. // *(arr+j+1) = temp;
    19. // }
    20. // }
    21. // }
    22. //上述的可以替换成下面的
    23. for(int i = 0;i<n;i++){
    24. for(int j = 0;j<n-i-1;j++){
    25. if(arr[j].num > arr[j+1].num){
    26. Student7 temp = arr[j];
    27. arr[j] = arr[j+1] ;
    28. arr[j+1] = temp;
    29. }
    30. }
    31. }
    32. }
    33. void coutStuArr(Student7 *arr,int n){
    34. cout << "---------------------输出为------------"<<endl;
    35. for(int i = 0;i<n;i++){
    36. //注意数组的每个元素是结构体变量
    37. cout << arr[i].num << " " <<arr[i].name<<endl;
    38. }
    39. }
    40. void test10(){
    41. Student7 Tomarr[3];
    42. memset(&Tomarr,0,sizeof(Student7));
    43. int n = sizeof(Tomarr)/sizeof(Tomarr[0]);
    44. //封装 获取键盘输入
    45. inputStuArr(Tomarr,n);
    46. //给数组排序
    47. sortStuArray(Tomarr,n);
    48. //输出结构体数组的内容
    49. coutStuArr(Tomarr,n);
    50. }
    51. int main()
    52. {
    53. test10();
    54. return 0;
    55. }

    6.6结构体的指针成员

    6.6.1 结构体的指针成员定义

    name 是一个指向 const char 的指针,在 C++11 之前的版本中,可以将字符串字面值直接赋值给 const char* 类型的指针。但从 C++11 开始,需要将 name 的声明改为 const char*,以便与字符串字面值类型匹配。通过在 name 声明中添加 const 关键字,表示 name 是一个指向常量字符串的指针,并且可以安全地将字符串赋值给 const char* 类型的指针。这样就符合了 C++11 引入的更严格的类型匹配规则。 

    jery.name保存的是"jery"的首元素地址,而"jery"字符串本身存储在文字常量区

    6.6.2 结构体指针成员指向堆区

    使用new申请新的空间后再赋值,注意C++11以后需要使用strcpy_s并且携带大小。最后别忘记释放申请的堆区空间,


    6.6.3 结构体的浅拷贝

    相同类型的结构体变量可以整体赋值,默认赋值方式为: 浅拷贝

    浅拷贝仅仅会复制指针的地址,而不会去复制指针所指向的内容。

    如果结构体中没有指针成员 浅拷贝不会带来问题

    如果结构体中有指针成员浅拷贝会带来多次释放堆区空间的问题:

    错误的原因是,此时导致了多次释放,但是不释放,又申请了内存。此时就会产生内存泄露的危机。 


    6.6.4 结构体的深拷贝

    如果结构体中有指针成员尽量使用深拷贝
    所谓的深拷贝,就是为结构体的指针成员分配独立空间 然后再内容拷贝 


    6.6.5 结构体变量在堆区结构体的指针成员也指向推区

     

  • 相关阅读:
    python和SciPy速成
    【文件读取/包含】任意文件读取漏洞 afr_2
    走近棒球运动·韩国职业棒球联盟·MLB棒球创造营
    Android使用Zxing库生成PDF417扫描后多一个字符A
    PTA_乙级_1096
    centos7服务器系统如何安装宋体字文件
    jenkins安装
    抖音矩阵系统,短视频矩阵系统,抖音SEO系统源码。
    Python安装教程(Windows10系统)
    在线考试答题刷题小程序
  • 原文地址:https://blog.csdn.net/Phofomy/article/details/134392882