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

6.5结构体指针变量

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


6.5.1结构体指针变量的定义

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

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第1张图片

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

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第2张图片


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

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

struct Student7 {
    int num;
    char name[20];
};
void inputStuArr(Student7 *arr,int n){
     cout<<"请输入"<> (arr + i)->num >> (arr + i)->name;
     }
}
void sortStuArray(Student7 *arr,int n){
//    for(int i = 0;inum > (arr+j+1)->num){
//               Student7 temp = *(arr+j);
//               *(arr+j) = *(arr+j+1);
//               *(arr+j+1) = temp;
//            }
//        }
//    }
    //上述的可以替换成下面的
    for(int i = 0;i arr[j+1].num){
               Student7 temp = arr[j];
               arr[j] = arr[j+1] ;
               arr[j+1] = temp;
            }
        }
    }
}

void coutStuArr(Student7 *arr,int n){
     cout << "---------------------输出为------------"<

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第3张图片

6.6结构体的指针成员

6.6.1 结构体的指针成员定义

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第4张图片

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并且携带大小。最后别忘记释放申请的堆区空间,

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第5张图片


6.6.3 结构体的浅拷贝

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

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

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

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

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第6张图片

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

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第7张图片
6.6.4 结构体的深拷贝

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

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第8张图片

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第9张图片
6.6.5 结构体变量在堆区结构体的指针成员也指向推区

【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第10张图片

 【带头学C++】----- 六、结构体 ---- 6.6 结构体的指针成员_第11张图片

你可能感兴趣的:(C++从基础到抗大旗,c++,开发语言,算法,学习,数据结构,排序算法)