在德尔福:
如何获得指针指向的地址(0x2384293)?
var iValue := Integer;
iptrValue := PInteger;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
iptrValue := @iValue;
iValue := 32342;
//Should return the same value:
Edit1.Text := GetAddressOf(iptrValue);
Edit2.Text := GetAddressOf(iValue);
Run Code Online (Sandbox Code Playgroud)
那么现实中的GetAddress是什么:)
我很抱歉,我知道有关指针,数组等的问题有一百万个,尽管基本上这样我似乎无法找到任何指向(哈哈!)的答案.
我有一个初始化为指向一块内存的指针,我知道我可以像访问数组一样访问这个内存:
char *mMem=new char[5000];
cout<<mMem[5]<<endl;
Run Code Online (Sandbox Code Playgroud)
实际上是:
char *mMem=new char[5000];
cout<<*(mMem+5)<<endl;
Run Code Online (Sandbox Code Playgroud)
我不明白的是如何获取元素的地址- 我知道元素不是一个正确的单词,因为mMem不是一个数组 - 如果我的理解是正确的,那就不可能当然,因为看起来每个站点在指针和数组时都会使用它想要的任何单词.所以,如果我有:
char *mMem=new char[5000];
cout<<mMem[5]<<endl;
or
cout<<*(mMem+5)<<endl;
Run Code Online (Sandbox Code Playgroud)
为什么运算符的地址不能正常工作:
cout<<&mMem[5]<<endl;
Run Code Online (Sandbox Code Playgroud)
我没有获取第5个元素的地址,而是从该元素开始打印出内存块内容.那么,为什么运算符的地址不能像我期望的那样工作呢?如何获得内存元素的地址?
为什么返回的指针地址的十六进制值总是按降序排列?例如在这里int a被宣布之前int d,所以它的地址总是出来是大于d,和同为&b,&e和&c,&f我想知道,这是一个固定的行为,或者是这个编译器相关的?我正在使用gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-1)
#include<stdio.h>
int main(void){
int a=1;
int d=1;
char b='a' ;
char e='a';
float c=1.0;
float f=1.0;
printf("a=%p\nd=%p\nb=%p\ne=%p\nc=%p\nf=%p\n",&a,&d,&b,&e,&c,&f);
if (&a>&d)
printf("&a>&d\n");
else
{printf("&a<&d");
}
if (&a>&d && &b>&e && &c>&f)
printf("addresses are in descending order");
else{
printf("false");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
a=0xbfc6bd98 //a>d
d=0xbfc6bd94
b=0xbfc6bd9f //b>e
e=0xbfc6bd9e
c=0xbfc6bd90 //c>f
f=0xbfc6bd8c
&a>&d
addresses are in descending order
Run Code Online (Sandbox Code Playgroud)
PS:我是c的新手
我如何JMP到C中的特定地址?
我想用
goto 0x10080000
Run Code Online (Sandbox Code Playgroud)
这不行,有没有其他方法可以改变程序计数器的地址?
我刚刚执行了这个代码示例:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
0x7fff38fed6a8, 0x10f7010
Run Code Online (Sandbox Code Playgroud)
所以我想知道为什么第二个地址比第一个地址短?
我今天观察到一些奇怪的行为,代码如下:
#include <iostream>
struct text
{
char c;
};
int main(void)
{
text experim = {'b'};
char * Cptr = &(experim.c);
std::cout << "The Value \t: " << *Cptr << std::endl ;
std::cout << "The Address \t: " << Cptr << std::endl ; //Print weird stuff
std::cout << "\n\n";
*Cptr = 'z'; //Attempt to change the value
std::cout << "The New Value \t: " << *Cptr <<std::endl ;
std::cout << "The Address \t: " << Cptr << std::endl …Run Code Online (Sandbox Code Playgroud) 我正在使用C.我正在尝试做的是一个函数,它将返回一个包含指向对象的地址的int.然后,使用我收到的int(包含地址),并构建一个指向该地址的指针.
示例:
MyClass* obj = SomeMethodReturningAPointerOfMyClass();
int address = (int) &obj;
return address;
Run Code Online (Sandbox Code Playgroud)
我认为它适用于这一部分.我得到的值是-4197276.(也许我完全错了?)
然后,另一方面,我想做的事情如下:
MyClass* obj = (MyClass*) address;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我无法访问任何obj方法而不会收到错误.
我找到了一种方法:
MyClass* obj = SomeMethodReturningAPointerOfMyClass();
machine->registers[2] = (int)obj;
Run Code Online (Sandbox Code Playgroud)
然后,在我收到整数的另一种方法中:
MyClass* obj = (MyClass*)address;
Run Code Online (Sandbox Code Playgroud)
我可以完美地完成对象!可能不是那么干净但它应该为它的用途做好工作!
感谢所有花时间回答的人!
我一般都知道了指针的逻辑,但对于我来说,有一点与下面的代码有关.
#include <iostream>
using namespace std;
int main ()
{
int first = 50,
second = 150;
int * p1, * p2;
p1 = &first; //p1 is assigned to the address of first
p2 = &second; //p2 is assigned to the address of second
*p1 = 100; //first's value is changed as 100 by assigning p1's value to 100
*p2 = *p1; //now p2's value should be 100
p1 = p2; //I think we want to change p1's adress as …Run Code Online (Sandbox Code Playgroud) 有人解释为什么下一个代码在ntdll.dll中返回一个指针?
GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");
Run Code Online (Sandbox Code Playgroud)
PS:如果调用kernel32的export表指向的函数,则抛出一个断点.