函数传参的方式、指针和一维数组、二级指针、常量指针、指针常量

一、函数传参的方式

1.值传递

  • 值传递是单向的,只能把实参的值传给形参
  • 在函数调用过程中,如果形参的值发生变化是不会影响到实参值

2.地址传递(指针传参)

  • 在函数调用过程中,如果形参的值发生变化是不会影响到实参值
  • 通过形参指针可以改变实参指针所指向的存储单元中的值

二、指针与一维数组

1.指向数组的指针

  • 将数组名(其实就是数组的首地址)赋值给一个指针,该指针就是指向数组的指针
    int a[5]={1,2,3,4,5};
    int *p=a;//p就是指向数组的指针,p指向数组中的第一个元素
  • 通过指向数组的指针可以操作数组中的元素
    int a[5]={1,2,3,4,5};
    int *p=a;
    cout<<"a[1]="<<*(p+1)<<endl;//a[1]=2
    *(p+2)=30;
    cout<<"a[2]="<<*(p+2)<<endl;//a[2]=30

2.数组的遍历方式

  • 下标法:引用数组元素可以通过下标找到对饮的元素并对其进行操作
  • 指针法:通过指向数组的指针可以引用到所需的元素并对其进行操作
    在编译时,编译器会将a[i]当成*(a+i)来编译(i为数组下标),因此数组就算越界也不会语法报错,但可能会造成不可预知的错误。
    int a[5]={1,2,3,4,5};
    int *p=a;
    int i;
    for(i=0;i<5;i++)//下标法
        cout<<a[i]<<" ";
    for(i=0;i<5;i++)//指针法
        cout<<*(a+i)<<" ";
    for(i=0;i<5;i++)//指针法
        cout<<*(p+i)<<" ";
    for(;p<(a+5);p++)//指针法
        cout<<*p<<" ";

3.数组的传参方式

数组作为函数参数的四种传参方式:
在这里插入图片描述

void print_array1(int array[],int size);
void print_array2(int *ap,int size);
int main()
{
    int a[]={1,2,3,4,5};
    int *p=a;
    int i;

    print_array1(a,5);//实参是数组名,形参是数组名
    cout<<endl;
    print_array1(p,5);//实参是指针,形参数组名
    cout<<endl;
    print_array2(a,5);//实参是数组名,形参是指针
    cout<<endl;
    print_array2(p,5);//实参是指针,形参是指针
    return 0;
}
void  print_array1(int array[],int size)
{
    int *p;
    for(p=array;p<(array+size);p++)//指针法
        cout<<*p<<" ";
}
void print_array2(int *ap,int size)
{
    int *p;
    for(p=ap;p<(ap+size);p++)//指针法
        cout<<*p<<" ";
}

三、二级指针

  • 二级指针(又称指针的指针)
  • 二级指针指向另一个指针变量
  • 二级指针的定义:** 二级指针变量 = & 一级指针变量
  • 二级指针变量中存放的是一级指针变量的地址
    int a=10;
    int *p=&a;//一级指针存储的是一般变量的地址
    int **pp=&p;//二级指针指向的是一级指针变量

    cout<<"p="<<p<<endl;//p=0x6dfee8
    cout<<"*p="<<*p<<endl;//*p=10

    cout<<"pp="<<pp<<endl;//pp=0x6dfee4
    cout<<"**pp="<<**pp<<endl;//**pp=10、等同于*(*pp)=10,指针运算符是右结合

    if(pp==&p && *pp==p && **pp==a)
    {
        cout<<"pp==&p"<<endl;
        cout<<"*pp==p"<<endl;
        cout<<"**pp==a"<<endl;
    }
        if(*(&p)==p)
        cout<<"*(&p)==p指针运算和取地址运算是反运算符"<<endl;

四、常量指针、指针常量、指向常量的指针常量

1.常量指针

  • 指针本身即地址,可以被修改
  • 通过该指针不可以修改它所指向的存储单元中的值
  • 常量指针的定义:类型说明符 const *指针变量;
    int a=10,b=100;
    int const *p=&a;//不可以改所指向的存储单元的值,即不可以改a的值
    cout<<*p<<endl;
    p=&b;//但是指针本身可以被修改,可以让指针指向变量b
    cout<<*p<<endl;
  • 通过其他指针还是可以修改常量指针所指向的存储单元中的值
    int b=100;
    int const *p=&b;
    int *p2=&b;
    cout<<*p<<endl;
   // *p=5;//error:assignment of read—only location '*p',通过该指针不可以修改它所指向的存储单元中的值
    *p2=5;//其他指针还是可以修改*p所指向的存储单元中的值
    cout<<*p2<<endl;

2.指针常量

  • 指针本身即地址,不可以被修改
  • 通过该指针可以修改它所指向的存储单元中的值
  • 指针常量的定义:类型说明符 * const 指针变量;
    int a=6;
    int b=66;
    int * const p=&a;
    //p=&b;//error:assignment of read—only location '*p' 指针本身即地址,不可以被修改
    cout<<*p<<endl;
    *p=77;
    cout<<*p<<endl;
  • 定义一个二阶指针,让二级指针指向指针常量,从而修改指针常量(但是会出现警告)

3.指向常量的指针常量

  • 指针本身即地址,不可以被修改
  • 通过该指针不可以修改它所指向的存储单元中的值
  • 指向常量的指针常量定义:类型说明符 const * const 指针变量;
    int a=6;
    int d=7;
    int const * const cpi=&a;
    *cpi=8;//error
    cout<<*cpi<<endl;
    cpi=&d;//error
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值