前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 指针总结

C++ 指针总结

作者头像
星宇大前端
发布2019-10-25 09:19:26
6850
发布2019-10-25 09:19:26
举报
文章被收录于专栏:大宇笔记大宇笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ZY_FlyWay/article/details/102490751

最近在blink看到很多刚学C++的学弟学妹,手有点痒,毕业快5年了,C++一直也没怎么用过,一直在移动端玩。写这篇文章回顾下C++我在大学学习时候的误区,希望可以让和我一样的同学少走点弯路。

指针 这是我大学的噩梦,好几个问题一直在脑子里转来转去,虽然老师讲了指针就是一块内存,它可以指向另一个内存。但是用法还是千奇百怪,一用就晕。

头大的问题:

1、*p , **p , ***p 怎么可以无限的☞下去?

2、 &和指针又是什么关系

3、int * array = a[n] 数组和指针啥关系呢?

4、 函数指针和指针函数

下面一个一个解决这些问题。

为什么要用指针?


解决上面的问题之前,先弄清,指针是什么,我们为什么要用它。

定义:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。

那么为什么要用指针呢?我们可以直接使用已经声明的变量或者常量啊。

答:可以想从下面几点想。 1、如果我们想在程序中共享一块内存,通俗的说就是好几个地方都想用一个内存的值,是不是这时候用指针比较方便。 2、比如链表等数据结构,用指针实现会不会比较容易

其他用处不说了,总之可以看出是为了更方便的使用数据。

总结:为了更方便的去使用数据\color{red}{总结: 为了更方便的去使用数据}总结:为了更方便的去使用数据

问题一: 指针指向指针的故事


其实这个问题挺简单,只是以前被我想复杂了,主要是二维数组的例子。

先看一个图:

在这里插入图片描述
在这里插入图片描述

然后看下 *p , **p, , ***p的例子:

void pointerToPointer(){
    int a = 3;
    int* p = &a;
    int** pp = &p;
    int*** ppp = &pp;
    
    cout << "a的地址:" << &a << endl;

    cout << "p的地址:" << &p  << endl;
    cout << "pp的地址:" << &pp  << endl;
    cout << "ppp的地址:" << &ppp  << endl;
    
    cout << "p的指向地址:" << p  << endl;
    cout << "pp的指向地址:" << pp  << endl;
    cout << "ppp的指向地址:" << ppp  << endl;
}

打印结果如下:

a的地址:0x7ffeefbff55c
p的地址:0x7ffeefbff550
pp的地址:0x7ffeefbff548
ppp的地址:0x7ffeefbff540
p的指向地址:0x7ffeefbff55c
pp的指向地址:0x7ffeefbff550
ppp的指向地址:0x7ffeefbff548

结论:

由程序可以看出,ppp->pp->p-> a,这个就是指针指向指针。

问题二:& 和 指针 是什么关系


& 取地址、引用的意思。

从上个例子可知,&a为a的内存地址。

它和指针没有关系,为什么以前有误区,因为弄不清指针地址,和指针指向地址的概念。

问题三: 数组和指针的关系


相信学C语言的同学一定想过这个问题。

首先数组的数据结构了解一下,数组会开辟一个连续的内存地址存储序列,那么访问数组的话,我们只需要知道头地址和长度就可以全部推出来吧。

知道了这个理解起来就简单多了。

看下面代码:

void  arrayAndpointer(){
    int a[5] = {1,2,3,4,5};
    // a = &a[0]  a是a[0]取地址的另外一种写法
    //然后 p指针指向首地址
    int * p = a;
    for (int i = 0; i < 5; i++) {
        cout << "p指向地址的值:" << *p << endl;
        p++;
    }
}

看了代码和备注是不是理解就简单多了。

问题四: 函数指针和指针函数


纸老虎!!!

别被他们俩的名字给吓住了。相当于a++ , ++a。

指针函数:是一个函数,只不过返回一个指针。 函数指针:就是一个指针。

这种问题就是看最后面的名词,是什么就是什么其他都是修饰成分。

先说一下指针函数(看下代码就懂了):

std::string  thisIsAPointFunc();

int main(int argc, const char * argv[]) {
    
    cout <<  thisIsAPointFunc() << endl;

    return 0;
}

string  thisIsAPointFunc(){
    string s = "这是一个指针函数";
    return s;
};

函数指针(看代码):

//这是一个加法函数
int add(int x,int y){
    return x + y;
}

//这是一个函数指针
int (*funcPointer)(int x, int y);

int main(int argc, const char * argv[]) {
    //指向加法函数
    funcPointer = add;
    //执行函数指针指向函数
    int z = funcPointer(3,5);
    cout << z << endl;
    return 0;
}

是不是so easy.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要用指针?
    • 问题一: 指针指向指针的故事
      • 问题二:& 和 指针 是什么关系
        • 问题三: 数组和指针的关系
          • 问题四: 函数指针和指针函数
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档