1、指针的定义(两种)
- 在定义指针的同时进行初始化赋值:储存类型 数据类型 *指针名=初始地址;如:int *p=&a;
- 在定义之后,单独使用赋值语句:指针名=地址;如:int p=&a;
//定义指针 int a = 10; int* p; //让指针记录变量a的地址 p=&a;//将a的地址赋给p,p返回的是一个地址,而*p返回的是一个数。
2、指针的使用
- 可以通过解引用的方式来找到指针指向的内存;
- 指针前加 * 代表解引用,找到指针指向的内存中的数据。
*p = 1000;//将值修改为1000 cout << "a= " << a << endl; cout << "*p= " << *p << endl;
3、空指针和野指针
- 空指针用于给指针变量进行初始化
int* p = NULL; //也可以这样命名 int *p; p=0; //空指针是不可以进行访问的 0~255之间的内存编号是系统占用的,因此不可以访问 *p = 100;//运行报错
- 野指针
//在程序中,尽量避免出现野指针 int* p = (int*)0x1100; cout << *p << endl;
4、指针的类型
- const修饰指针 常量指针:此时不能通过指针来改变所指对象的值,但是指针本身可以改变,可以指向另外的对象。
int a = 10; int b = 10; const int* p = &a; //指针指向的值不可以改,指针的指向可以改 *p = 20;//错误 p = &b;//正确 //确保指针所指向的常量不被意外改变
- const修饰常量 指针常量 :指针本身的值不能被改变,即指针指向不可以改变
//指针的指向不可以改,指针指向的值可以改 int* p2 = &a; *p2 = 100;//正确 p2 = &b;//错误,指针的指向不可以改
- const修饰指针和常量
const int* const p3 = &a; //指针的指向 和指针指向的值 都不可以改 *p3 = 100;//错误 p3=&b;//错误
- void 型指针
5、this指针(实际就是一个 指针常量 ,指针的指向是不可以修改的)
- this指针是一个隐含于每一个类的非静态成员函数中的特殊指针(包含构造函数和析构函数),用于指向正在被成员函数操作的对象;
- 指向被正在调用的成员函数所属的对象,来缓解多个成员函数之间名称的冲突;
class Person { public: Person(int age) { //this指针指向 被调用的成员函数 所属的对象 所指的p1对象 age = age;//错误,三个age,编译器认为是同一个,而左age是对象的age; this->age = age; } Person PersonAddAge(Person& p) {//不加&则变成了复制构造函数返回的是复制构造函数的值, //p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);返回的值是20,每次调用一次复制构造函数 this->age += p.age; //this指向p2的指针,而*this指向的就是p2这个对象本体 return *this;//*this 返回的是一个对象 } int age; } //2 返回对象本身用 *this void test02() { Person p1(10); Person p2(10); //链式编程思想 p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);//////////////利用this指针进行链式编程思想 cout << "p2的年龄为:" << p2.age << endl; } int main() { test02();//返回为20 system("pause"); return 0; }
class Person { public: Person(int age) { //this指针指向 被调用的成员函数 所属的对象 所指的p1对象 age = age;//错误,三个age,编译器认为是同一个,而左age是对象的age; this->age = age; } Person& PersonAddAge(Person& p) { this->age += p.age; //this指向p2的指针,而*this指向的就是p2这个对象本体 return *this;//*this 返回的是一个对象 } int age; }; //1解决名称冲突 void test01() { Person p1(18); cout << "p1的年龄为:" << p1.age << endl; } //2 返回对象本身用 *this void test02() { Person p1(10); Person p2(10); //链式编程思想 p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);//////////////利用this指针进行链式编程思想 cout << "p2的年龄为:" << p2.age << endl; } int main() { test01();//返回值为18 test02();//返回值为40 system("pause"); return 0; }