函数地址(不知道是否确切!)

本问参考网友的一篇TApplication的介绍而写的!

讨论的内容是只是个函数地址的东西!

假如你现在要在TStatusBar上显示时间,你可能有很多的方法,现在看这种:

void __fastcall TForm1::tryidle(TObject * Sender, bool & Done)
{
        Form1->StatusBar1->SimpleText=DateTimeToStr(Now());
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Form1->OnDblClick=tryer; 
        Application->OnIdle=tryidle;
         Form1->Button1->OnClick=Button3Click; 
}

如果你一定要问我:Sender和Done做什么用,我告诉你,根本没有用,只是为了凑成一个和Application->OnIdle一模一样的东西而已!

上边的资料取自www.chinabcb.com里的一篇文章!先边的是我自己考虑的东西,不知道有没有意思,如果你看了有帮助,那可别忘了谢谢那位幕后英雄啊!

其他的对象可以吗!我想也是可以的,于是我就继续,试一试TButton,就写了几个TButton在Form1上!

void __fastcall TForm1::Button3Click(TObject *Sender)
{
        ShowMessage("Button3Click!");
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Form1->OnDblClick=tryer;
        Application->OnIdle=tryidle;       

        Form1->Button1->OnClick=Form1->Button3->OnClick;

}

天呢,竟然不行!怎么办!改!

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Form1->OnDblClick=tryer;
        Application->OnIdle=tryidle;
        Form1->Button1->OnClick=Button3Click
}

保存在试,居然可以了!松了口气!

不过为什么不行呢!我不太明白!

查资料:TButton OnClick 是这么解释的!

Occurs when the user clicks the control.

__property Classes::TNotifyEvent OnClick = {read=FOnClick, write=FOnClick, stored=
IsOnClickStored};

Description

Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action抯 OnExecute method responds to click events unless it is superseded by an OnClick event handler.

Usually OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when

The user selects an item in a grid, outline, list, or combo box by pressing an arrow key.
 The user presses Spacebar while a button or check box has focus.
 The user presses Enter when the active form has a default button (specified by the Default property).
 The user presses Esc when the active form has a cancel button (specified by the Cancel property).
 The user presses the accelerator key for a button or check box.

The Checked property of a radio button is set to true.
 The value of the Checked property of a check box is changed.
 The Click method of a menu item is called.

For a form, an OnClick event occurs when the user clicks a blank area of the form or on a disabled component.

TNotifyEvent 是什么东西呢!

NotifyEvent is used for events that do not require parameters.

Unit

Classes

typedef void __fastcall (__closure *TNotifyEvent)(System::TObjectTObject* Sender);

Description

The TNotifyEvent type is the type for events that have no event-specific parameters. These events simply notify the component that a specific event occurred. For example, OnClick, which is of type TNotifyEvent, notifies the control that a click event occurred on the control.

The Sender parameter is the object whose event handler is called.  For example,.with the OnClick event of a button, the Sender parameter is the button component that is clicked.

呵呵!

看明白没有啊!TNotifyEvent 是不需要参数的事件,那个Sender是个被呼叫的句柄!明白了没有,不过我是这么理解的!

### 获取 `printf` 函数地址的方法 在 C 语言中,标准库函数如 `printf` 是由编译器链接的标准库提供支持的。这些函数本质上是一个全局符号,在程序运行时会被加载到内存中的某个位置。可以通过取地址的方式获得其具体地址。 以下是获取 `printf` 函数地址的具体方法: #### 方法一:直接打印函数地址 可以直接将 `printf` 的地址作为参数传递给另一个输出函数(例如 `fprintf` 或者 `printf` 自身),从而显示该函数地址。 ```c #include <stdio.h> int main() { // 打印 printf 函数地址 printf("Address of printf function: %p\n", (void *)printf); return 0; } ``` 上述代码会输出类似于以下的结果: ``` Address of printf function: 0x7ffff7a8f9e0 ``` 这里需要注意的是,`(void *)printf` 将函数指针强制转换为通用指针类型 `(void *)`,以便能够正确地将其地址打印出来[^1]。 --- #### 方法二:通过调试工具查看 如果希望更深入地了解 `printf` 在内存中的布局或者动态行为,可以借助 GDB 这样的调试工具来观察其实现细节以及存储地址。 启动 GDB 并附加断点后执行如下命令: ```bash (gdb) p printf $1 = {<text variable, no debug info>} 0x7ffff7a8f9e0 <__printf> ``` 这表明当前进程中 `printf` 被映射到了虚拟地址空间的位置 `0x7ffff7a8f9e0` 中[^2]。 --- #### 关于堆栈顺序与 `printf` 参数的关系 当调用带有可变数量参数的函数(如 `printf`)时,实际参数按照特定平台上的 ABI(Application Binary Interface)规定依次压入堆栈。通常情况下,整型数据先被处理,浮点数可能涉及额外寄存器操作。因此,虽然理论上有一定规律可循,但在现代复杂架构下,确切的行为依赖具体的硬件环境和编译选项设置。 --- ### 注意事项 - 同的操作系统或编译环境下,`printf` 的实际地址可能会有所同。 - 使用 `%p` 来格式化指针类型的值是一种标准化做法,确保跨平台兼容性。 - 对于嵌套调用场景下的精确分析,建议结合汇编层面的知识进一步研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值