小编ibr*_*ead的帖子

如何用cout打印函数指针?

我想用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++

49
推荐指数
3
解决办法
4万
查看次数

编译器用a [i]做什么?a是数组?如果a是指针怎么办?

c-faq告诉我,编译器在处理a [i]时做了不同的事情,而a是数组或指针.这是c-faq的一个例子:

char a[] = "hello";
char *p = "world";
Run Code Online (Sandbox Code Playgroud)

鉴于上面的声明,当编译器看到表达式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)

c c++ arrays assembly pointers

14
推荐指数
1
解决办法
943
查看次数

在C/C++中sizeof()的机制是什么?

看来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的参数添加调用它.那尺寸做什么呢?

c c++ sizeof

8
推荐指数
3
解决办法
2990
查看次数

如何在成对总和中找到第k个最大数,如setA + setB?

这里有两个整数集,比如说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)算法中学习未排序数组中的中位数.

谢谢.

algorithm

6
推荐指数
1
解决办法
2059
查看次数

在Python中的函数中使用大数据结构时的效率

我需要使用大数据结构,更具体地说,使用大字典来完成查找工作.

在最初我的代码是这样的:

#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)

python pass-by-reference function-call

5
推荐指数
2
解决办法
1863
查看次数

为什么httplib和urllib返回的响应代码不匹配?

我正在写一个死链接探测器,想知道我应该使用哪个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自动检测重定向并获取最终目标页面,然后返回响应代码?

谢谢.

python http

2
推荐指数
1
解决办法
535
查看次数