2020-09-25C++学习笔记引用2:二级指针形参与指针引用搭配做形参的使用方法区别重难点,注意事项主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)
1、指针引用
#include "iostream"
using namespace std;
struct Teacher
{
char name[64];
int age;
};
int getTe(Teacher **myp )
{
Teacher *p = (Teacher *)malloc(sizeof(Teacher));
if (p ==NULL)
{
return -1;
}
memset(p, 0, sizeof(Teacher));
p->age = 33;
*myp = p; //
return 0;
}
//指针的引用而已
int getTe2(Teacher* &myp)
{
myp = (Teacher *)malloc(sizeof(Teacher));
myp->age = 34;
return 0;
}
void main()
{
Teacher *p = NULL;
//getTe(&p);
getTe2(p);
printf("age:%d \n", p->age);
system("pause");
}
2、常引用
2.1在C++中可以声明const引用
const Type& name = var;
const引用让变量拥有只读属性
2.2使用字面量常量初始化const引用
思考:
1、用变量对const引用初始化,const引用分配内存空间了吗?
2、用常量对const引用初始化,const引用分配内存空间了吗?
void main()
{
const int b = 10;
printf("b:%d", &b);
//int &a1 = 19; 如果不加const编译失败
const int &a = 19;
printf("&a:%d \n", &a);
system("pause");
}
综合代码
1、指针形参
2、引用形参
3、二级指针形参
4、指针引用形参
#include <iostream>
#include <string>
using namespace std;
/* 一级指针与引用的对比
*
*/
struct student
{
char *name;
int age;
};
void yinyong(student &student1)
{
student1.name=(char *)"xiaoming";
student1.age=10;
printf("name:%s,age:%d\n",student1.name,student1.age);
}
void zhizhen(student *student2)
{
student2->name=(char *)"xiaohong";
student2->age=12;
printf("name:%s,age:%d\n",student2->name,student2->age);
}
/*二级指针与引用的对比
*/
int two_pinter(student **student3)
{
// student3=new student;//这里分配的内存空间后来会被释放掉
// if(student3==NULL) return -1;
(*student3)->name=(char *)"xiaoli";
(*student3)->age=10;
// printf("name:%s,age:%d\n",(*student3)->name,(*student3)->age);
}//二级指针的另一种写法
int two_pinter1(student **student3)
{
student *p=new student;//*p是常量,若p=studengt3,虽然*p是存储的students1的地址但它已不是指针类型,
//无法实现*p->name,*p->age,这个错误不能再犯
if(*student3==NULL) return -1;
p->name=(char *)"xiaoding";
p->age=12;
*student3=p;
// printf("name:%s,age:%d\n",(*student3)->name,(*student3)->age);
}
int two_yinyong(student *&student4)
{
// student4=new student;
// if(student4==NULL) return -1;
student4->name=(char *)"xiaoxiao";
student4->age=18;
// printf("name:%s,age:%d\n",student4->name,student4->age);
}
//常引用
int main(int argc,char *argv[])
{
student students;
student *students1=new student;//定义指针型形变量必须初始化。
//常引用
char a=10;
const char &m=a;
char *p = (char *)&m;
*p=11;
// m=12;m为只读属性无法修改
printf("a:%d,m:%d,*p:%d\n",a,m,*p);
//字面量常引用
const char &n=20;
printf("n:%d\n",n);
// char &n=20;是 error
yinyong(students);
zhizhen(&students);
two_pinter(&students1);
printf("name:%s,age:%d\n",students1->name,students1->age);
two_yinyong(students1);
printf("name:%s,age:%d\n",students1->name,students1->age);
two_pinter1(&students1);
printf("name:%s,age:%d\n",students1->name,students1->age);
return 0;
}