C++ 引用和指针

以下为代码运行环境:

环境 版本
OS macOS Mojave version10.14.6
cmake 3.15.3
vscode 1.40.2

一、 什么是引用?换句话说就是另一变量的别名。

[数据类型] & 名称 = 变量名;

int a = 0;
int &b = a;

这里的b就是引用。

注意:

  • & 不是取地址运算符
  • int 是数据类型
  • 引用的声明一定要初始化
  • 数组没有引用

引用有什么用?

  • 做函数参数(可以提高效率,在数据量大的时候是这样)
  • 常引用(即在引用的定义前加上const);这样在做参数的时候可以防止数据被修改。
int a = 1;
const int &b = a;
b = 2;// wrong
a = 2; // right
  • 引用作为函数返回值( [数据类型] & 函数名(参数列表){})
#include <iostream>
using std::printf;
int &fun1(int x);
int ref;
int main(){
    int c = fun1(5);
    printf("ref = %d, c = %d, &c = %p, &ref = %p\n",
    ref,c,&c,&ref);
    int &d = fun1(10);
    printf("ref = %d, c = %d, &d = %d, &d = %p, &ref = %p\n",
    ref,c,d,&d,&ref);
    return 0;
}
int &fun1(int x){
    ref =x*x;
    return ref;
}

打印的结果如下:

ref = 25, c = 25, &c = 0x7ffee1b70848, &ref = 0x10e090018
ref = 100, c = 25, &d = 100, &d = 0x10e090018, &ref = 0x10e090018

Notes:

  1. 不能返回局部变量的值
  2. 不能返回函数内部new分配的内存的引用
  3. 可以返回类成员的引用,但最好是const

结论:
引用就是一个目标变量的别名,可用以函数的参数及返回值,还用作常引用。

二 、指针介绍

1. 1 指针与const
  • 让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。
    -- [const 数据类型 *]
  • 将指针本身声明为常量,可以防止改变指针指向的位置。
    -- [数据类型 * const]
int a = 39;
int b = 40;
const int * pa = &a; // pa指向一个const int,因此不能用pa来修改这个值。
pa = &b;//正确,但是pa一样不能修改值。
1. 2 指针与数组
  • 数组名为数组的第一个元素的地址
int apple[5] = {1,2,3,4,5};
int * pt = apple;//等同于 * pt = &apple[0]; 即 apple == &apple[0];
  • 数组表示法(即用方括号:apple[5])等同于对指针解除引用。
apple[0] 与 *apple 是相等的。
apple[3] 与*(apple+3) 也是相等的。

//以下这个是恒等式
arr[i] == *(arr +i);
&arr[i] == arr +i;
注意:
  1. 对数组名使用sizeof将得到整个数组的长度。
  2. 将地址运算符&用于数组名时,将返回整个数组的地址。
2. 函数指针
  • 声明指向某种数据类型的指针时,必须指定指针指向的类型。声明指向函数的指针时,也必须指定指针指向的函数类型。声明应像函数原型那样指出有关函数的信息。
int power(int);//函数原型
int (*pp)(int);//函数指针原型

这个与power()声明类似,只是将power替换为(*pp)。

注意:
这里加了(),因为括号的优先级比*运算符高。因此 :
1. *pp(int) 意味着pp()是一个返回指针的函数
2. (*pp)(int)意味着pp是一个指向函数的指针

#include <iostream>
using std::printf;
int power(int);
void mypp(int x, int (*p)(int));
int main(){
    mypp(12, power);
    return 0;
}
int power(int x){
    return x * x;
}
void mypp(int x, int (*p)(int)){
    printf("print (*p)() = %d\n", (*p)(x));
    printf("print p() = %d\n", p(x));
}

最后,回顾下 数组指针,指针数组,函数指针
1.int * pa[2]; //定义了指针数组pa,元素是指向int型的指针。
2.int (*pa)[2];//定义了数组指针pt,元素是指向int[2]数组的指针。//****
3.int * pf(int);//定义了一个函数,返回指针类型值。
4.int (*pf)(int);//定义了一个函数指针,返回int型值。

为配合说明,以下是代码及输出:

#include <iostream>
using std::printf;

int main(){
    int a[2][2] = {{1,2},{3,4}};
    int b[2] = {5,6};
    int (*p)[2];
    int (*pa)[2];

    p = a;
    for(int i = 0;i<2;i++){
        for(int j = 0;j<2;j++){
            printf("p[%d][%d] = %d \n",i,j,p[i][j]);
        }
    }
    printf("\n");

    pa = &b;
    for(int i=0;i<2;i++){
        printf("pa[%d] = %d, pa[%d] address : %p \n",
        i,*pa[i],i,pa[i]);
    }    
    printf("\n");

    printf("pa[0][0] = %d, pa[0][0] address : %p\n",
    pa[0][0],&pa[0][0]);
    printf("pa[0][1] = %d\n",pa[0][1]);
    return 0;
}

输出:

p[0][0] = 1
p[0][1] = 2
p[1][0] = 3
p[1][1] = 4

pa[0] = 5, pa[0] address : 0x7ffee7217828
pa[1] = 1, pa[1] address : 0x7ffee7217830

pa[0][0] = 5, pa[0][0] address : 0x7ffee7217828
pa[0][1] = 6

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容