C++ 指针篇

简介: 指针大小:32位操作系统中指针占4个字节; 64位操作系统中指针占8个字节

指针

基础指针使用

    int num = 99;
    int *p;//定义一个整型指针变量p
    p = #//指针变量p指向num的地址空间(两个指向同一个地址)

指针大小

32位操作系统指针占4个字节; 64位操作系统占8个字节

void PointerSize(){
    int *p;
    double *q;
    char *c;
    cout << "整型指针所占的内存大小" << sizeof(p) << endl;//8字节
    cout << "浮点型指针所占的内存大小" << sizeof(q) << endl;//8字节
    cout << "char指针所占的内存大小" << sizeof(c) << endl;//8字节
}

空指针与野指针

空指针和野指针都不是自主申请的空间,访问会出现异常

/// Description 空指针和野指针
void NullPointer(){
    //对于未初始化的指针,可以指向NULL,即指向内存地址为0的地址,
    //内存地址0~255是系统占用的,不允许被访问
    //强行访问,会抛空指针异常
    int *p = NULL;
    
    //p指向一个系统随机分配内存空间的地址,其内容为100
    //但是仅语法上通过,但不能通过编译
    int *q = (int *)100;
}

const修饰的指针

const修饰指针:常量指针

语法:const 类型* p;

     int num = 100;
    //常量指针特点
    //1.不允许修改指向的值,例如:*p = 100;(error)
    //2.允许修改指向的地址,例如:*p = &a;(ok)
    const int *p = &num;//定义一个整型常量指针

const修饰常量:指针常量

语法: 类型* const p;

    // 指针常量特点
    //1.允许修改指向的值,例如:*p = 100;(ok)
    //2.不允许修改指向的地址,例如:*p = &a;(error)
    //注:因为指针常量以及指向了一个地址,为常量,所有不能修改地址,但可以修改地址的值。
    int * const q = &num;//定义一个指针常量

const修饰指针和常量

语法: const 类型* const p;

     //const同时修饰指针和常量
    //一担初始化之后,既不允许修改地址,也不允许修改内容
    const int * const w = &num;

指针与数组

void ArrayAndPointer(){
    int array[] = {0,1,2,3,4};
    int *p = array;//定义一个整型指针变量p,指向数组array首元素地址
    cout << "当前p指向数组首元素的值=" << *p << endl;
    p++;//指针变量p指向第二个数组元素地址&array[1],因为数组在内存当中的地址是连续的
    cout << "当前p指向数组第二个元素的值=" << *p << endl;
    
    //1.使用循环的方式遍历数组
    cout << "数组内容为:";
    for(p = array;p <= &array[4];p++)
        cout << *p;
    cout << '\n' << endl;
    
    //2.使用循环的方式遍历数组
    p = array;
    cout << "数组内容为:";
    for(int i= 0;i < 5;i++)
        cout << *p++;
    cout << '\n' << endl;
}

值传递与地址传递

值传递

/// Description 值传递
/// 实参不会随着形参的改变而改变
/// - Parameters:
///   - a: 参数1
///   - b: 参数2
void ValueSwap(int a,int b){
    int temp = a;
    a = b;
    b = temp;
}

地址传递

/// Description 地址传递
/// 因为形参和实参指向同一地址,所以实参会随着形参的改变而改变
/// - Parameters:
///   - a: 参数1
///   - b: 参数2
void AddressSwap(int *a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

冒泡排序

/// Description 通过将指针指向的数组进行排序
/// - Parameters:
///   - array: 数组内容
///   - size: 数组元素个数
void BubbleSort(int *array,int size){
    for(int i = 0;i< size-1;i++){
        for(int j=i+1;j< size;j++){
            if(*(array+i) > *(array+j)){
                int temp = *(array+i);
                *(array+i) = *(array+j);
                *(array+j) = temp;
            }
        }
    }
}

结构体与指针

/// 使用struct关键字建立一个结构体
/// 可以包容不同数据类型或成员类型作为结构体成员
/// 如果使用了typedef声明的struct结构体,则Admit为Student的一个别名
/// 若不使用typedef进行声明,则Admit为Student的一个对象,可以直接进行使用
typedef struct Student{
    string name;
    int age;
    char sex[4];
    int score;
}Admit;

//结构体嵌套
typedef struct Leader{
    Student stu;
    string position;
};

结构体的三种初始方式

void StructStudent(){
    /// 通过实例化对象之后,通过成员访问符.进行访问结构体成员并赋初始值
    Student zhangsan;
    zhangsan.name = "张三";
    zhangsan.age = 20;
    strcpy(zhangsan.sex, "男");
    zhangsan.score = 80;
    PrintfStudent(zhangsan);
    
    /// 在实例化的时候进行初始化赋值
    Student lisi = {"李四",21,"女",90};
    PrintfStudent(lisi);
    
    Admit wangwu = {"王五",28,"女",80};
    PrintfStudent(wangwu);
    
    /// 结构体指针,通过->操作符访问结构体成员
    Student *p = &zhangsan;
    p->name = "赵二";
    strcpy(p->sex, "女");
    p->score = 99;
    PrintfStudent(zhangsan);
    
    //嵌套结构体的使用,并通过调用嵌套结构体成员并修改其内容
    Leader *l = (Leader*)malloc(sizeof(Leader));
    l->stu = lisi;
    l->stu.name = "牛一";
    l->position = "班长";
    PrintfLeader(*l);
}
相关文章
|
16天前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。
|
16天前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this-&gt;name`和`this-&gt;age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
29天前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
23 1
|
1月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
1月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
49 4
|
2月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
27 2
|
2月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
23 3
|
1月前
|
存储 C++
c++学习笔记06 指针
C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
29 0
|
2月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
21 6