golang-指针类型

golang-指针类型,第1张

tips: 号,可以指向指针类型内存地址上的值,&号,可以获取值类型的内存地址

每一个变量都有内存地址,可以通过变量来 *** 作内存地址中的值,即内存的大小

go语言中获取变量的内存地址方法:通过 & 符号可以获取变量的地址

定义:普通变量存储的是对应类型的值,这些类型就叫值类型

变量b,在内存中的地址为:0x1040a124,在这个内存地址上存储的值为:156

定义:指针类型的变量存储的是⼀个地址,所以⼜叫指针类型或引⽤类型

b 是值类型,它指向的是内存地址上的值

a是指针类型,它指向的是b的内存地址

指针类型定义,语法: var 变量名 类型

指针类型在定义完成后,默认为空地址,即空指针(nil)

在定义好指针变量后,可以通过 符号可以获取指针变量指向的变量

在这里的 a 等价于 b,通过修改 a ,最终修改的是值类型b的值

这里a,d是值类型,b,c是指针类型

d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储,d和a互不影响

b,c相当于指向了a的内存地址,当使用号引用出内存地址上的变量上,修改值得,a的值也会跟着改变

我的理解是你的父类指针是通过子类指针赋值的,然后想知道是那个子类指针给当前的父类指针赋的值,你可以通过动态转换,再把父类指针转换成原来的子类指针

Child pChild = dynamic_cast<Parent > pParent ;

如果转换的结果 pChild不为NULL,说明原先赋值给父类指针的子类就是这个子类,你可以一个一个尝试

MFC框架下,你将文档类作为APP的成员或者extern引用是错误的,这样不能正确获取类运行实例。

在View视图类,直接GetDocument()即可获取文档类指针。

在其它任意框架内代码中:

AfxGetMainWnd()->GetActiveView()->GetDocument();//获取文档类指针

教你一个最简单的原则,就是VC里面的函数调用原则。其实,VC里面的函数调用,没有你想想的那么难。

原则一、如果类是系统提供的类,如view类,doc类,系统会提供 获取指向该类指针的函数。例如,vc里面获取view类的指针:

CMainFrame pMain=(CmaimFrame )AfxGetApp()->m_pMainWnd;

CyouView pView=(CyouView )pMain->GetActiveView();

获取frame类的指针:

CWinApp 中的 m_pMainWnd变量就是MainFrame的指针

也可以:

CMainFrame pMain =(CMainFrame )AfxGetMainWnd();

关于这些类的指针获取,参考下面这篇文章。

>

假如 对象A(就是问题中的MainWindow)中有对象B和对象C, 如果对象B的信号connect到对象C的槽函数, 只能是其中一个对象有另一对象的指针, 或者在对象A中connect

假设我有一个叫testdll的动态库,其中有一个函数如下:

extern "C" int add(int a,int b,int c,int d,char PicPath)

{

FILE fp;

fp=fopen(PicPath,"wt");

for(int i=0;i

{

c[i]=a[i]+b[i];

fprintf(fp,"%d\n",c[i]);

}

fclose(fp);

return 1;

}

该函数的功能是a,b两个数组的值相加,和存放的数组c中,在将和写入到指定的文件,数组的维数

有传入的参数决定。

问题提出:

1Java中如何调用指针类型的参数;

2整形的参数可以直接传入吗?;

3PicPath为何是指针型的,怎么不是CString类型的;

4如何获取输入型参数的返回值;

Java调用动态链接库的代码如下:

JNative t= new JNative("testdll", "add"); //加载testdll文件,并调用add方法;

tsetRetVal(TypeINT); // 设置调用后的返回类型

// Java中构造指针,并为指针分配空间

Pointer a = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));

Pointer b = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));

Pointer c = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));

Pointer strP= createPointer(100);

strPsetStringAt(0, "C:\\1txt");

int d=10;

// 为数组a和b赋值

for (int i = 0; i

asetIntAt(4 i, i);

bsetIntAt(4 i, i);

}

// 设置参数:

tsetParameter(0, a);

tsetParameter(1, b);

tsetParameter(2, c);

tsetParameter(3, d);

tsetParameter(4, strP);

tinvoke(); // 调用函数并执行

// 输出和的值,注意:一个整形值需要用4个字节存储,所以j前面需要乘以4

for (int j = 0; j

Systemoutprintln(cgetAsInt(4 j));

}

// 释放内存

adispose();

bdispose();

cdispose();

好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一

个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他

例子。

问题解答:

1Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间

2整形的数据可以直接传入;

3JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成

的字符指针;

4输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。

以上就是关于golang-指针类型全部的内容,包括:golang-指针类型、c++已知父类的指针,如何正确获取这个指针指向子类的大小、MFC程序使用文档类指针,其他类使用extern调用,编译正常,运行报错等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9297672.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存