我想用cout打印出一个函数指针,发现它不起作用.但是在将函数指针转换为(void*)之后它才起作用,printf与%p一样,例如
#include <iostream>
using namespace std;
int foo() {return 0;}
int main()
{
int (*pf)();
pf = foo;
cout << "cout << pf is " << pf << endl;
cout << "cout << (void *)pf is " << (void *)pf << endl;
printf("printf(\"%%p\", pf) is %p\n", pf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用g ++编译它并获得如下结果:
cout << pf是1
cout <<(void*)pf是0x100000b0c
printf("%p",pf)是0x100000b0c
那么cout对int(*)()类型做了什么?我被告知函数指针被视为bool,是真的吗?cout用type(void*)做什么?
提前致谢.
编辑:无论如何,我们可以通过将函数指针转换为(void*)并使用cout将其打印出来来观察函数指针的内容.但它对成员函数指针不起作用,编译器抱怨非法转换.我知道成员函数指针是一个比简单指针更复杂的结构,但是我们如何才能观察成员函数指针的内容呢?
c-faq告诉我,编译器在处理a [i]时做了不同的事情,而a是数组或指针.这是c-faq的一个例子:
Run Code Online (Sandbox Code Playgroud)char a[] = "hello"; char *p = "world";
鉴于上面的声明,当编译器看到表达式a [3]时,它会发出代码从位置"a"开始,移动三个,然后在那里获取字符.当它看到表达式p [3]时,它会发出代码从"p"位置开始,在那里获取指针值,向指针添加三个,最后获取指向的字符.
但有人告诉我,在处理[i]时,编译器倾向于将a(这是一个数组)转换为指向数组的指针.所以我想查看汇编代码以找出哪个是正确的.
编辑:
这是本声明的来源.c-faq 并注意这句话:
形式a [i]的表达式导致数组衰减成指针,遵循上面的规则,然后被下标,就像表达式p [i]中的指针变量一样(尽管最终的内存访问将是不同,"
我对此很困惑:既然a已经衰减到指针,那为什么他的意思是"内存访问会有所不同?"
这是我的代码:
// array.cpp
#include <cstdio>
using namespace std;
int main()
{
char a[6] = "hello";
char *p = "world";
printf("%c\n", a[3]);
printf("%c\n", p[3]);
}
Run Code Online (Sandbox Code Playgroud)
这是我使用g ++ -S array.cpp获得的汇编代码的一部分
.file "array.cpp"
.section .rodata
.LC0:
.string "world"
.LC1:
.string "%c\n"
.text
.globl main
.type main, @function
main:
.LFB2:
leal 4(%esp), %ecx
.LCFI0:
andl $-16, %esp
pushl -4(%ecx)
.LCFI1:
pushl …
Run Code Online (Sandbox Code Playgroud) 看来sizeof不是真正的功能吗?
例如,如果你这样写:
int i=0;
printf("%d\n", sizeof(++i));
printf("%d\n", i);
Run Code Online (Sandbox Code Playgroud)
你可能得到如下输出:
4
0
Run Code Online (Sandbox Code Playgroud)
当你深入研究汇编代码时,你会发现这样的:
movl $4, %esi
leaq LC0(%rip), %rdi
xorl %eax, %eax
call _printf
Run Code Online (Sandbox Code Playgroud)
所以,编译器直接将常量"4"作为printf的参数添加调用它.那尺寸做什么呢?
这里有两个整数集,比如说A和B,我们可以得到另一个集合C,其中每个元素都是A中元素a和B中元素b的总和.
例如,A = {1,2},B = {3,4},我们得到C = {4,5,6},其中4 = 1 + 3,5 = 1 + 4 = 2 + 3,6 = 2 +4
现在我想找出哪个数字是集合C中第k个最大的数字,例如5是上面例子中的第二大数字.
有效的解决方案吗?
我知道成对求和排序是一个开放的问题,并且有一个^ 2较低的时间界限.但由于只需要第k个最大数,因此我们可以从O(n)算法中学习未排序数组中的中位数.
谢谢.
我需要使用大数据结构,更具体地说,使用大字典来完成查找工作.
在最初我的代码是这样的:
#build the dictionary
blablabla
#look up some information in the ditionary
blablabla
Run Code Online (Sandbox Code Playgroud)
由于我需要多次查看,我开始意识到将它实现为函数是个好主意,比如查找(info).
然后问题来了,我应该如何处理大字典?
我应该使用lookup(info,dictionary)将其作为参数传递,还是应该只在main()中初始化字典并将其用作全局变量?
第一个似乎更优雅,因为我认为维护全局变量很麻烦.但另一方面,我不确定将大字典传递给函数的效率.它将被多次调用,如果传递的参数效率低下,它肯定会成为一场噩梦.
谢谢.
EDIT1:
我刚刚对上述两种方式进行了实验:
这是代码的片段.lookup1实现传递查找的参数,而lookup2使用全局数据结构"big_dict".
class CityDict():
def __init__():
self.code_dict = get_code_dict()
def get_city(city):
try:
return self.code_dict[city]
except Exception:
return None
def get_code_dict():
# initiate code dictionary from file
return code_dict
def lookup1(city, city_code_dict):
try:
return city_code_dict[city]
except Exception:
return None
def lookup2(city):
try:
return big_dict[city]
except Exception:
return None
t = time.time()
d = …
Run Code Online (Sandbox Code Playgroud) 我正在写一个死链接探测器,想知道我应该使用哪个lib,httplib和urllib,所以我试过了.
def http_response_code(url):
host = urlparse(url)[1]
req = '/'.join(urlparse(url)[2:5])
conn = httplib.HTTPConnection(host)
conn.request('HEAD', req)
res = conn.getresponse()
return res.status, res.reason
def urllib_response_code(url):
a = urllib.urlopen(url)
return a.getcode()
def main():
url = 'http://1010wins.com/content_page.php?contenttype=4&contentid=6077355'
print http_response_code(url)
print urllib_response_code(url)
Run Code Online (Sandbox Code Playgroud)
但我对上述两种方法返回的结果不匹配感到困惑,这两种方法是:
(302,'发现')
200
我想也许是因为urllib自动检测重定向并获取最终目标页面,然后返回响应代码?
谢谢.