c++,new,delete,成员指针

new和delete用来申请动态内存空间,一定要配对使用

#include <string>
#include <ctype.h>
#include <vector>
#include <iostream>
#include <fstream>

// using declarations states our intent to use these names from the namespace std
using namespace  std;

int main()
{
    int *p = static_cast<int*>(malloc(sizeof(int)));
    //对于内置类型,如int,double,float,char...即使不用new声明,使用delete释放也不会出任何编译,运行错误,但是对于任何类类型,不管是自定义还是系统自带的,都会出错误
    int *p_new = new int; //分配一个int类型的地址空间,不进行初始化
    int *p_new_1 = new int(10);//初始化为10
    int n = 10;//如果n过大,会导致内存申请失败抛出错误,如果不想抛出错误可以再new后面加上nothrow //为什么说是动态分配内存,因为n是变量,是不确定的,所以每次分配的内存不确定,是在运行时分配
    char *p_new_array = new(nothrow) char[n];//对于内置类型,n为0时这样写没问题,而且可以进行解引用,并且直接delete不用数组括号也行
    string *p_new_string = new string[n];//n为0时无法进行解引用,会报错,不加括号的delete出错,也不能进行解引用。

    cout << *p << endl;
    cout << *p_new << endl;
    cout << *p_new_1 << endl;
    cout << *p_new_array << *(p_new_array+1) << endl;

    //delete p;// 基本内置类型可以,对于类类型这样不行,因为不是用new声明的
    delete p_new;p_new=null;//将悬空指针变为空指针
    delete p_new_1;  p_new_1=null;
    delete p_new_array; p_new_array=null;//错误的写法,只对基本内置类型有效
    delete[]p_new_string; //正确的写法,要和相应的new配对

    return 0;
}

成员地址,是相对于开始地址的相对偏移。

#include <string>
#include <ctype.h>
#include <vector>
#include <iostream>
#include <fstream>
#include<new>

// using declarations states our intent to use these names from the namespace std
using namespace  std;
struct Date
{
    int year;
    int month;
    int day;
    void print(){ cout << year << "-" << month << "-" << day << endl; }
};

void showYear(Date a[], int length, int Date::*year);
int main()
{
    Date a[5] = { { 2001, 1, 1 }, { 2002, 2, 2 }, { 2003, 3, 3 }, { 2004, 4, 4 }, { 2005, 5, 5 } };
    Date d = { 1997, 7, 9 };
    cout << "&d = " << &d << endl;
    cout << "&d.year = " << &d.year << " &d.month = " << &d.month << " &d.day =" << &d.day << endl; //绝对地址
    cout << &Date::year << &Date::month << &Date::day << endl;//成员地址打印出来是111,c++认为成员地址和函数地址无意义,所以都直接处理为true,在输出也就显示为1
    //cout << static_cast<int*>(&Date::year) << endl; //那么,强转来看看地址,结果报错,不能转换
    //匿名联合,两个变量同用同一个空间
    union
    {
        int n;
        int Date::*mp;
    };
    mp = &Date::day;
    cout << "n = " << n << endl;//输出8,相对于year的地址
    //通过成员地址来访问结构中的成员
    cout << d.*mp << endl;

    //应用,访问a数组中的,所有日期中的年份
    showYear(a, sizeof(a)/sizeof(Date), &Date::year);

    //成员函数指针
    d.print();
    void (Date::*p)() = &Date::print;
    (d.*p)();
    return 0;
}

void showYear(Date a[], int length, int Date::*p)//p是date中某个成员的地址,不可用day,year,month,会造成表达模糊
{
    for (int i = 0; i < length;++i)
    {
        cout << a[i].*p << " "; //a[i].year表达不出我想要用成员地址的意愿,因为year本来就是成员
        //p是成员地址,*p是结构中的某个成员,a[i].*p,取出这个成员
    }
    cout << endl;
}

c++,new,delete,成员指针,布布扣,bubuko.com

时间: 2024-08-14 11:54:38

c++,new,delete,成员指针的相关文章

【转载】C/C++杂记:深入理解数据成员指针、函数成员指针

原文:C/C++杂记:深入理解数据成员指针.函数成员指针 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针.而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始地址的偏移值,空指针用-1表示.例: 代码示例:   2. 函数成员指针 函数成员指针与普通函数指针相比,其size为普通函数指针的两倍(x64下为16字节),分为:ptr和adj两部分. (1) 非虚函数成员指针 ptr部分内容为函数指针(指向一个全局函数,该函数的第一个参数为this指针),ad

成员指针

成员变量指针 静态成员变量.静态成员函数与对象无关,静态成员指针与普通指针一致 本质就是特定成员变量在对象实例中的相对地址,解引用时再根据调用对象的地址计算该成员变量的绝对地址 定义   类型 类名 ::* 成员变量指针 = &类名 ::成员变量 使用  对象.*成员变量指针\对象指针->*成员变量指针 =====>  .*成员变量解引用\->* 间接成员变量解引用 成员函数指针 虽然成员函数并不存储在对象中,但也要通过对象或者对象指针对成员函数指针解引用,其目的只有一个,即提供

C++拾遗--类成员指针

C++拾遗--类成员指针 前言 类成员的类型与一般类型不同,那么类成员的指针类型自然与一般类型的指针有所区别.我们有必要来探讨下类成员指针的使用. 正文 类成员指针是指可以指向类的非静态成员的指针.它的类型包括了类类型和所指向的成员类型.一般而言,指针指向的是对象,而类成员指针指向的是类成员而非类对象. 需要指出,类成员指针不是可调用对象,要想通过类成员指针调用类成员,需结合类对象或类指针.静态类型成员属于类,类型与普通指针相似. 数据成员指针 一般的声明形式: 成员类型 classname::

free和delete把指针怎么啦?

别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉. 用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”.如果此时不把p设置为NULL,会让人误以为p是个合法的指针. 如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理.很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指

EDKII CR宏:根据成员指针获取父结构体变量指针

核心提示: 1. CR宏 (Containing Record):根据成员指针获取父结构体变量指针 2. 0 指针的妙用. 在EDKII 的代码中有不少关于CR宏的使用,如 时钟中断处理函数CoreTimerTick. VOID EFIAPI CoreTimerTick ( IN UINT64 Duration ) { IEVENT *Event; ... if (!IsListEmpty (&mEfiTimerList)) { Event = CR (mEfiTimerList.Forward

[C++ primer]类成员指针

1.声明成员指针 有时我们希望直接获取成员的指针,然后从一个对象或别的对象获得该成员,这时就需要用到成员指针.成员指针,包含类的类型以及成员的类型. 成员指针只针对类的非static成员.static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针. 注:它指向的是一个类的特定成员,而不是指向一个特定对象里的特定成员. 成员指针的定义格式:成员类型 类名::*指针名=&类名::成员名; 成员函数指针的定义格式: 成员函数返回类型 类名::*指

C++ Primer 学习笔记_103_特殊工具与技术 --类成员指针

特殊工具与技术 --类成员指针 成员指针可以做到:获得特定成员的指针,然后从一个对象或别的对象获得该成员.成员指针应该包含类的类型以及成员的类型. 一.声明成员指针 测试类: class Screen { public: typedef std::string::size_type index; char get() const; char get(index ht,index wd) const; private: std::string contents; index cursor; ind

C/C++杂记:深入理解数据成员指针、函数成员指针

1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针. 而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始地址的偏移值,空指针用-1表示.例: 代码示例: struct X { int a; int b; }; #define VALUE_OF_PTR(p) (*(long*)&p) int main() { int X::*p = 0; // VALUE_OF_PTR(p) == -1 p = &X::a; // VALUE_OF_PTR(p) ==

C Language Study - 结构体成员指针初始化

结构体成员指针初始化 不可以正确运行的初始化方式(1): #include <stdio.h> #include <string.h> #include <malloc.h> //#include "a.h" //char a[100]; struct stu { char* name; int num; }*pst,st; void init_pst() { pst = (struct stu *)malloc(sizeof(struct stu)