c指针和引用和函数指针

2019-05-21  本文已影响0人  黑小柴

引用:引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

int main(){
   int a = 1;
   int& b = a;// 引用一个引用变量,别名的别名
   cout<<"a:address->" <<&a<< endl;
   cout<<"b:address->" <<&b<< endl;
   a = 2;
   cout<<a<<endl;
   b = 3;
   cout<<a<<endl;
   int& c = b;
   cout<<a<<endl;
   c = 4;
   cout<<a<<endl;
}
结果
a:address->0x7ffeefbe675c
b:address->0x7ffeefbe675c
2
3
3
4

指针传参

void change(int *a,int *c,int *e){
    printf("%p\n",a);
    printf("%p\n",c);
    printf("%p\n",e);
    int *b =a;
    *b=3;
    int *d;
    d=c;
    *d=4;
    *e=5;
}

int main(){
    int i=0,j=0,k=0;
    change(&i,&j,&k);
    printf("i=%d,j=%d,k=%d\n",i,j,k);
    return 0;
}

结果
0x7ffe057626fc
0x7ffe05762700
0x7ffe05762704
i=3,j=4,k=5

引用传参

void change(int &a, int &b,int &c){
   printf("%p\n",&a);
   printf("%p\n",&b);
   printf("%p\n",&c);
   a=3;
   b=4;
   c=5;
}

int main(){
    int i=0,j=0,k=0;
    change(i,j,k);
    printf("i=%d,j=%d,k=%d\n",i,j,k);
    return 0;
}
结果
0x7ffeeb281758
0x7ffeeb281754
0x7ffeeb281750
i=3,j=4,k=5

函数指针

int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 
 
    printf("最大的数字是: %d\n", d);
 
    return 0;
}
// 回调函数
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}
 
// 获取随机值
int getNextRandomValue(void)
{
    return rand();
}
 
int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    for(int i = 0; i < 10; i++) {
        printf("%d ", myarray[i]);
    }
    printf("\n");
    return 0;
}
1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
值传递的方式无法实现交换,因为传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销毁,并不会影响外部left和right的值。
void Swap (int left, int right)
     int temp = left;
     left = right ;
     right = temp ;
}
 
2.【引用传递】如果形参为引用类型,则形参是实参的别名。
使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值,减少了复制的开销,加快程序执行效率。
void Swap (int& left, int& right)
{
     int temp = left;
     right = left ;
     left = temp ;
}
 
3.【指针传递】
传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。
void Swap (int* pLeft, int* pRight)
{
     int temp = *pLeft;
     *pLeft = *pRight;
     *pRight = temp;
}
上一篇 下一篇

猜你喜欢

热点阅读