指针的那点事儿

Posted on 2021-11-18 15:35  wwc小六子  阅读(24)  评论(0)    收藏  举报

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;
}

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3