结构体的指针变量:本质是变量只是该变量保存的是结构体变量的地址
通过指针,可以访问到我们结构体变量的值
可以通过 -> 符号 访问到结构体变量
指针变量保存结构体数组元素的地址
- struct Student7 {
- int num;
- char name[20];
- };
- void inputStuArr(Student7 *arr,int n){
- cout<<"请输入"<<n<<"个学员信息(num,name)"<<endl;
- for(int i = 0;i<n;i++){
- //注意数组的每个元素是结构体变量
- cin >> (arr + i)->num >> (arr + i)->name;
- }
- }
- void sortStuArray(Student7 *arr,int n){
- // for(int i = 0;i<n;i++){
- // for(int j = 0;j<n-i-1;j++){
- // if((arr+j)->num > (arr+j+1)->num){
- // Student7 temp = *(arr+j);
- // *(arr+j) = *(arr+j+1);
- // *(arr+j+1) = temp;
- // }
- // }
- // }
- //上述的可以替换成下面的
- for(int i = 0;i<n;i++){
- for(int j = 0;j<n-i-1;j++){
- if(arr[j].num > arr[j+1].num){
- Student7 temp = arr[j];
- arr[j] = arr[j+1] ;
- arr[j+1] = temp;
- }
- }
- }
- }
-
- void coutStuArr(Student7 *arr,int n){
- cout << "---------------------输出为------------"<<endl;
- for(int i = 0;i<n;i++){
- //注意数组的每个元素是结构体变量
- cout << arr[i].num << " " <<arr[i].name<<endl;
- }
-
- }
- void test10(){
- Student7 Tomarr[3];
- memset(&Tomarr,0,sizeof(Student7));
- int n = sizeof(Tomarr)/sizeof(Tomarr[0]);
- //封装 获取键盘输入
- inputStuArr(Tomarr,n);
- //给数组排序
- sortStuArray(Tomarr,n);
- //输出结构体数组的内容
- coutStuArr(Tomarr,n);
- }
-
- int main()
- {
- test10();
- return 0;
- }
name
是一个指向 const char
的指针,在 C++11 之前的版本中,可以将字符串字面值直接赋值给 const char*
类型的指针。但从 C++11 开始,需要将 name
的声明改为 const char*
,以便与字符串字面值类型匹配。通过在 name
声明中添加 const
关键字,表示 name
是一个指向常量字符串的指针,并且可以安全地将字符串赋值给 const char*
类型的指针。这样就符合了 C++11 引入的更严格的类型匹配规则。
jery.name保存的是"jery"的首元素地址,而"jery"字符串本身存储在文字常量区
使用new申请新的空间后再赋值,注意C++11以后需要使用strcpy_s并且携带大小。最后别忘记释放申请的堆区空间,
相同类型的结构体变量可以整体赋值,默认赋值方式为: 浅拷贝
浅拷贝仅仅会复制指针的地址,而不会去复制指针所指向的内容。
如果结构体中没有指针成员 浅拷贝不会带来问题
如果结构体中有指针成员浅拷贝会带来多次释放堆区空间的问题:
错误的原因是,此时导致了多次释放,但是不释放,又申请了内存。此时就会产生内存泄露的危机。
如果结构体中有指针成员尽量使用深拷贝
所谓的深拷贝,就是为结构体的指针成员分配独立空间 然后再内容拷贝