C++指针探讨(一)数据指针

指针,在C/C++语言中一直是很受宠的;几乎找不到一个不使用指针的C/C++应用。用于存储数据和程序的地址,这是指针的基本功能。用于指向整型数,用整数指针(int*);指向浮点数用浮点数指针(float*);指向结构,用对应的结构指针(struct xxx *);指向任意地址,用无类型指针(void*)。

有时候,我们需要一些通用的指针。在C语言当中,(void*) 可以代表一切;但是在C++中,我们还有一些比较特殊的指针,无法用(void*)来表示。事实上,在C++中,想找到一个通用的指针,特别是通用的函数指针简直是一个“不可能任务”。

C++是一种静态类型的语言,类型安全在C++中举足轻重。在C语言中,你可以用void*来指向一切;但在C++中,void*并不能指向一切,就算能,也失去了类型安全的意义了。类型安全往往能帮我们找出程序中潜在的一些BUG.

下面我们来探讨一下,C++中如何存储各种类型数据的指针。

1.数据指针

数据指针分为两种:常规数据指针和成员数据指针

1.1 常规数据指针

这个不用说明了,和C语言一样,定义、赋值是很简单明了的。常见的有:int*, double* 等等。

如:

int value = 123;

int * pn = &value;

1.2 成员数据指针

有如下的结构:

struct MyStruct
{
int key;
int value;
};

现在有一个结构对象:

MyStruct me;

MyStruct* pMe = &me;

我们需要 value 成员的地址,我们可以:

int * pValue = &me.value;

//或

int * pValue = &pMe->value;

当然了,这个指针仍然是属于第一种范筹——常规数据指针。

好了,我们现在需要一种指针,它指向MyStruct中的任一数据成员,那么它应该是这样的子:

int MyStruct::* pMV = &MyStruct::value;

//或

int MyStruct::* pMK = &MyStruct::key;

这种指针的用途是用于取得结构成员在结构内的地址。我们可以通过该指针来访问成员数据:

int value = pMe->*pMV; // 取得pMe的value成员数据。

int key = me.*pMK; // 取得me的key成员数据。

时间: 2024-09-17 03:52:19

C++指针探讨(一)数据指针的相关文章

C++指针探讨(二)函数指针

在C/C++中,数据指针是最直接,也最常用的,因此,理解起来也比较容易.而函数指针,作为运行时动态调用(比如回调函数 CallBack Function)是一种常见的,而且是很好用的手段. 我们先简单的说一下函数指针.(这一部份没什么价值,纯是为了引出下一节的内容) 2 常规函数指针 void(*fp)(): fp 是一个典型的函数指针,用于指向无参数,无返回值的函数. void(*fp2)(int): fp2 也是一个函数指针,用于指向有一个整型参数,无返回值的函数. 当然,有经验人士一般都会

C++指针探讨(三)成员函数指针

C语言的指针相当的灵活方便,但也相当容易出错.许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下.但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序. 然而C++的指针却常常给我一种束手束脚的感觉.C++比C语言有更严格的静态类型,更加强调类型安全,强调编译时检查.因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换.而且这些指针的声明格式都不一样:

C++指针探讨(四)函数对象

函数对象不是函数指针.但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了. 这是入门级的随笔,说的是函数对象的定义,使用,以及与函数指针,成员函数指针的关系. 沐枫小筑 函数对象实质上是一个实现了operator()--括号操作符--的类. 例如: class Add { public: int operator()(int a, int b) { return a + b; } }; Add add: // 定义函数对象 cout << add(3,2): // 5 函数指

c-C语言:进程间传递指针来实现数据操作是否会有安全隐患?

问题描述 C语言:进程间传递指针来实现数据操作是否会有安全隐患? 涉及两个进程,A和B,A和B可通信. 进程A管理一个链表,A会把某个链表节点的一些特征参数发送给进程B,后面进程B会把一开始得到的节点特征发送回A,A再对链表进行遍历匹配,匹配对应的节点,进行操作. 如果A一开始把节点指针直接给B,B后面需要对节点操作时直接把指针发回给A,这样就不用遍历链表.但是这样做是不是不合理?就是是不是有安全性之类的问题? 解决方案 跨进程传递指针没有意义,对方进程拿到指针也访问不了内存.既然如此,为何要传

java-从一个指针里检索数据问题

问题描述 从一个指针里检索数据问题 我从数据库中检索信息这些信息都存在指针内.现在我需要去指针中的每个项目来检索信息然后显示在页面上. Cursor c = mDbHelper.fetchSpot(15); startManagingCursor(c); double lat = Double.parseDouble(c.getString(c.getColumnIndexOrThrow(ParkingSpotDBAdapter.KEY_LAT))); double lng = Double.p

cv 32f-OpenCV转换到lab颜色空间的CV_32F类型Mat图像分通道处理uchar指针和float数据

问题描述 OpenCV转换到lab颜色空间的CV_32F类型Mat图像分通道处理uchar指针和float数据 转换到lab颜色空间CV-32F类型Mat图像,需要分通道处理,3个通道,l.a.b都是CV-32F类型的Mat数据,使用uchar指针进行像素访问,并将3个通道处理结果赋值给一个新的CV-32F类型Mat图像testSal.问题是3个通道的处理结果仍是float型,赋值给uchar指针指向的对象可能会存在数据精度损失,在调试的过程中发现数据的值有问题,麻烦高人指点下怎么解决,万分感激

数组指针存储的数据怎么给新的空表 下面是代码帮忙看看

问题描述 数组指针存储的数据怎么给新的空表 下面是代码帮忙看看 void Create_class(Link &l)//创建班级信息 { Node p[100],; Link L; int j,m; int classnum=1; L = (Node)malloc(sizeof(Node)); printf("几个班:"); scanf("%d",&m); for(j = 0;j { l = (Node*)malloc(sizeof(Node));

调用C++dll,需要传入一个函数指针,函数参数含有数组指针,用于传回数据,怎么老说我访问内存非法呀.

问题描述 C++dll代码回掉函数类型:voidcallback(BYTE*data,intnlen)//DLL设置回调函数voidSetCallBackFunc(CALL_BACK_FUNCcallback){m_callback=callback;}//dll调用回掉函数向C#传回数据voidStartDll(){BYTEbtData[100];for(bytei=0;i<100;i++){btData[i]=i;}m_callback(btData,100);//将数据通过回掉函数传回C#

javascript中this指针探讨

javascript是一门类java语言有很多跟java相类似的特点,但也仅是类似而已,真正使用中还是有很大的差别.this指针常常让很多初学者抓狂,本人也曾为此困惑不解,查找过很多资料,今天在这里总结一下,希望能帮助后来者更快驯服这只拦路虎.网上有很多讲解this指针的文章其中不乏精品,以我看来了解this指针关键在于掌握javascript中函数的四种调用模式.那么什么是调用?调用指的是跟在任何产生一个函数值的表达式之后使用"()",obj.f()这种方式成为调用,obj.f这种方