C++基础 指针

1. 基本概念

a.作用:可以通过指针间接访问内存

*内存的编号一般都从0开始记录的,一般用十六进制数字表示

*可以利用指针变量保存地址

2. 指针变量的定义和使用

a. 指针定义语法:

数据类型 * 变量名

b. 指针的赋值:

指针变量 = &普通变量

*指针变量和普通变量定义的数据类型必须相同

c. 指针的使用:通过*操作指针变量指向的内存

    int a=1; int *p;
    p=&a;
    cout << p;
    cout <<*p;

输出p=0x0000,*p=1

d. 我们可以通过 & 符号 获取变量的地址,利用指针可以记录地址,对指针变量解引用,可以操作指针指向的内存

3. 指针所占用的内存空间

a. 32位操作系统下都占4个字节(byte),不论什么数据类型

b. 64位操作系统下都占8个字节 (byte),不论什么数据类型

4. 空指针

a. 指针变量指向内存中编号为0的空间

b. 初始化指针变量:Int * p = NULL;

c. 空指针指向的内存是不能访问的

    '''
    int main() {
    
        //指针变量p指向内存地址编号为0的空间
        int * p = NULL;
    
        //访问空指针报错 
        //内存编号0 ~255为系统占用内存,不允许用户访问
        cout << *p << endl;
    
        system("pause");
    
        return 0;
    }
    '''

5. 野指针

a. 指针变量只想非法的内存空间

b. 空指针和野指针都不是我们申请的空间,因此不要访问

6. const修饰指针

a. const修饰指针有三种情况

i. const修饰指针:常量指针

ii. const修饰常量:指针常量

b. 示例:

    '''
    int main() {
        int a = 10;
        int b = 10;

        //const修饰的是指针,指针指向可以改,指针指向的值不可以更改
        const int * p1 = &a; 
        p1 = &b; //正确
        //*p1 = 100;  报错 
    
        //const修饰的是常量,指针指向不可以改,指针指向的值可以更改
        int * const p2 = &a;
        //p2 = &b; //错误
        *p2 = 100; //正确
    
        //const既修饰指针又修饰常量
        const int * const p3 = &a;
        //p3 = &b; //错误
        //*p3 = 100; //错误
        system("pause");
        return 0;
    }
    '''

*看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量

7. 指针和数组

a. 作用:利用指针访问数组中的元素

b. 示例:

'''
#include<iostream>
using namespace std;
//利用指针遍历数组
int main()
{
    int arr[5] = { 1,2,3,4,5 };
    int* p = arr;
    for (int i = 0; i < 5; i++)
    {
        cout << *p << endl;
        p++;
    }
    system("pause");
    return 0;
}
'''

8. 指针和函数

a. 利用指针作为函数参数,可以修改实参的值

b. 示例:

    '''
    #include<iostream>
    using namespace std;
    //指针和函数
    //值传递
    void swap1(int a, int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    //地址传递
    void swap2(int* p1, int* p2)
    {
        int temp = *p1;
        *p1 = *p2;
        *p2 = temp;
    }
    int main()
    {
        int a = 10;
        int b = 20;
    
        cout << "值传递,不会改变实参" << endl;
        swap1(a, b);
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
    
        cout << "地址传递,可以改变实参" << endl;
        swap2(&a, &b);
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        system("pause");
        return 0;
    }
    '''

9. 指针,数组和函数

a. 利用指针数组和函数实现冒泡排序

b. 示例

    '''
    #include<iostream>
    using namespace std;
    //使用指针,数组和函数实现冒泡排序
    //冒泡排序函数(降序)
    void bubbleSort(int* arr, int len)
    {
        for (int i = 0; i < len-1; i++)
        {
            for (int j = 0; j < len-1-i; j++)
            {
                if (arr[j] < arr[j+1])
                {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
    //打印输出数组
    void print(int* arr, int len)
    {
        for (int i = 0; i < len; i++)
        {
            cout << arr[i] << " ";
        }
    }
    int main()
    {
        //定义数组
        int arr[10] = {0,1,2,3,4,5,6,7,8,9};
        int len = sizeof(arr) / sizeof(arr[0]);
        bubbleSort(arr, len);
        print(arr, len);
        system("pause");
        return 0;
    }
    '''

注:当时做笔记的时候中英文标点未分,大家见谅

感谢大家的阅读,欢迎大家评论和指出我的不足

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。