花式使用C/C++的指针

指针无疑是C/C++语言的精髓所在,用好了是把利剑,用不好就是一颗炸弹。指针出BUG了,分分钟会让你写程序崩溃

今天被C++的指针搞混了,翻阅了很多资料,有点懂了。赶快来做一下笔记。
先来使用一个最简单的指针

    int a = 10;
    int *p=&a;

这个没啥难度不会出错,接下来来个难点的

    int a = 10;
    int *p = &a;
    int **p1 = &p;

这个指针的指针是不是已经头皮发麻了,别急,还有更变态的——指针数组数组指针函数指针指针函数。这回是不是彻底懵了。
现在就开始一个个使用这些指针
首先要明确一点,指针数组和数组指针不是一个概念

int *p3[10];
这就定义了一个指针数组,
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有10个指针类型的数组元素


int (*p4)[10];
这是一个数组指针,因为()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是10


int* fun(int a);
这样就声明了一 个指针函数,就是返回指针的函数,函数可以不返回任何值,也可以返回整型值,实型值,字符型值,当然也可以返回指针值。函数fun需要在函数体中返回一个int型的指针。


int (*fun)(int a);
这样就定义了一个指向函数的指针,可以通过这个指针来调用函数,注意,这个指针不能指向任意的函数,只能指向返回值是int,并且只有一个形参的函数。
这些都是C中指针的使用,到了C++中,指针遇到类和对象,遇到new和delete这两个运算符,稍有不慎就会内存泄漏。
说了这么多,现在开始研究C++中指针的使用问题
先来新建一个Test类
Test.h

#pragma once
class Test
{
public:
    Test();
    Test(int _a);
    ~Test();
    int a;
};

Test.cpp

#include "stdafx.h"
#include "Test.h"
#include <iostream>
using std::cout;
using std::endl;


Test::Test():Test(0)//委托构造函数
{
    cout << "调用委托构造函数给a赋值 0"<<endl;
}

Test::Test(int _a=10):a(_a)//构造初始化,形参默认值=10
{
    cout << "call function Test(int _a) "<<endl;
}


Test::~Test()
{
    cout << "delete Test  " << a << endl;
}

main.cpp

// main.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Test.h"
#include <stdlib.h>

int main()
{
    /*1
    创建Test的实例,指针t1指向实例*/
    Test *t1 = new Test(6);

    delete t1;
    t1 = nullptr;


    /*2
    创建3个test实例数组  指针t2指向数组的第一个元素,
    此时只能调用Test类的无参构造函数*/
    Test *t2 = new Test[3];

    delete[] t2;//释放 test的三个实例
    t2 = nullptr;

    /*3 
    在堆中创建3个(Test)类型的指针数组,t3指向这个数组;*/
    Test* *t3 = new Test*[3];
    for (int i = 0; i < 3; i++)
    {
        /*创建3个Test的实例,让t3数组中的元素(指针)指向创建的对象*/
        t3[i] = new Test(i + 10);
    }

    for (int i = 0; i < 3; i++)
    {
        /*释放 在堆中创建的三个Test的实例*/
        delete t3[i];
    }

    delete[] t3;//释放动态创建的指向Test实例的指针数组


    system("pause");
    return 0;
}

先来开一下最简单的一种对象指针Test *t1 = new Test(6); 这时定义了一个Test类型的指针t1,并让这个指针指向从堆中申请的内存(Test的实例)运行以下看看

1

没意外,Test的实例正常创建,正常释放了。
再来看一下第二种情况

Test *t2 = new Test[3];

delete[] t2;

现在定义了一个Test的指针t2,并且在堆中创建了3个Test的实例,放在一个数组中,指针t2指向了这个数组。运行看一下
2

这时有一点要注意一下,这样new创建对象时只能调用Test类的默认无参构造函数,其他的函数不能调用。我们为了给a赋值,使用了委托构造函数(不太熟悉的同学可以忽略),从打印的结果来看,程序正常创建了Test的实例,也正常释放内存。
现在来看一下最复杂的一种情况

/*3 
在堆中创建3个(Test)类型的指针数组,t3指向这个数组;*/
Test* *t3 = new Test*[3];
    for (int i = 0; i < 3; i++)
    {
        /*创建3个Test的实例,让t3数组中的元素(指针)指向创建的对象*/
        t3[i] = new Test(i + 10);
    }

    for (int i = 0; i < 3; i++)
    {
        /*释放 在堆中创建的三个Test的实例*/
        delete t3[i];
    }

    delete[] t3;

是不是已经晕倒在电脑前了0.0     莫慌,先看一下运行结果

3

一步步来分析以下代码,首先看一下Test* *t3 = new Test*[3];t3是一个指针,它指向了堆中的一个数组,这个数组的类型是Test*的。new Test*[3]在堆内存中创建了一个长度为3的Test*的数组。重点t3指向的是堆中的一个数组
第一个for循环中的t3[i] = new Test(i + 10);是给t3所指向的数组中的元素赋值,因为数组是Test*类型的,所以可以指向Test类的实例。
第二个for循环中delete t3[i];是把在堆内存中创建的Test 类的实例释放。因为t3[i]是一个指针,而且是指针数组,也就是说t3[i],是t3指针指向的数组(在堆内存中)的一个元素,所以要把t3指向的数组释放delete[] t3;

好了先总结到这吧。项目我已经上传到码云,需要的可以下载

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

推荐阅读更多精彩内容