Cherish's Notebook
切换到深色模式
菜单
Wiki--浏览次数--访问次数--跳出率--平均停留

c++

通过指针保存一个地址,指针就是个地址

3.指针

通过指针保存一个地址,指针就是个地址

3.1定义指针

CODE
int main()
{
    //1.定义指针
    int a=10;
    //指针定义语法:数据类型*指针变量名;
    int*p;
    p=&a;
    cout<<"a的地址为:"<<&a<<endl;
    cout<<"指针p为:"<<p<<endl;//指针p表示的就是a的地址

    //2.使用指针
    //可以通过解引用的方式来找到指针指向的内存
    //指针前加*代表解引用,找到指针指向的内存中的数据
    *p=1000;
    cout<<*p<<endl;//1000
    cout<<a<<endl;//1000
}

3.2指针所占的内存空间

要注意:指针也是一种数据类型,也是要占内存空间的

在32位操作系统下:占用4个字节空间

在64位操作系统下:占用8个字节空间

上方是不管啥数据类型的

CODE
int main()
{
    //指针所占内存空间
    int a=10;
    //int *p;
    //p=&a;
    //上述可以写为以下:
    int *p=&a;
    cout <<"sizeof(int *)"<<sizeof(p)<<endl;//因为是看数据类型,写int *也可以,因为是int *类型   4字节(32位的话)
    cout <<"sizeof(int *)"<<sizeof(int *)<<endl  //4字节(32位的话)
    cout <<"sizeof(char *)"<<sizeof(char *)<<endl; //4字节(32位的话)
}

3.3空指针

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

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

CODE
int main()
{
    //1.空指针用于给指针变量进行初始化
    int *p=NULL;
    //2.空指针不能进行访问
    *p=100;//直接报错,压根不能访问
    //0~255之间的内存编号是系统占用的,因此不可以访问
}

3.4野指针

指针变量指向非法的内存空间

CODE
int main()
{
    int *p=(int *)0x1100; //定义了一个指针,直接去指向随便指定的地址-->野指针,是没有访问权限的
    //访问野指针报错
    cout<<*p<<endl;
}

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

3.5const修饰指针

三种情况:

  • const修饰指针 常量指针
  • const修饰常量 指针常量
  • const即修饰指针,又修饰常量
  1. 常量指针
CODE
const int *p=&a;

指针的指向可以修改,但是指针指向的值不可以修改,改为指向地址后,这个地址存的值还是这个值

  1. 指针常量
CODE
int *const p=&a;

指针的指向不可以改,指针指向的值可以改

  1. const即修饰指针,又修饰常量
CODE
const int *const p=&a;

指针的指向和指针指向的值都不可以改变

3.6指针和数组

CODE
int main()
{
    //利用指针访问数组中的元素
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    cout<<"数组的第一个元素为:"<<arr[0]<<endl;
    int *p=arr;//注意数才要加取地址符号&
    cout<<"数组的第一个元素为:"<<*p<<endl;
    p++; //让指针向后偏移4个字节
    cout<<"数组的第二个元素为:"<<*p<<endl;
    //利用指针遍历数组
    int *p2=arr;
    for (int i=0;i<10;i++)
    {
        cout<<*p2<<endl;
        p2++;
    }
}

3.7指针和函数

利用指针做函数参数,可以修改实参的值

值传递:只改变形参,不改变实参

地址传递:

CODE
void swap(int *p1,int *p2)
{
    int temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main()
{
    int a=10;
    int b=20;
    //地址传递
    swap(&a,&b);
    cout<<a<<endl;//20
    cout<<b<<endl;//10
}

总结:不想修改实参,就用值传递;想修改实参,就用值传递

3.8指针,数组,函数组合案例

案例描述:封装一个函数,利用冒泡排序,实现对整数数组的升序排序

例如数组:int arr10={4,3,6,9,1,2,10,8,7,5}

CODE
#include<iostream>
using namespace std;
void bubbleSort(int *p,int len)
{
    for(int i=0;i<len-1;i++)
    {
        for(int j=0;j<len-i-1;j++)
        {
            if(p[j]>p[j+1])
            {
                int temp=p[j];
                p[j]=p[j+1];
                p[j+1]=temp;
            }
        }
    }
}

int main()
{
    // 1.创建数组
    int arr[10]={4,3,6,9,1,2,10,8,7,5};
    int len=10;
    int *p=arr;
    // 2.创建函数,实现冒泡排序
    bubbleSort(p,len);

    // 3.打印排序后的数组
    for (int i=0; i<len; i++)
    {
        cout<<*p<<"";
        p++;
    }
}