V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
black11black
V2EX  ›  问与答

C 语言指针传递的问题

  •  
  •   black11black · 2020-12-03 07:08:53 +08:00 · 817 次点击
    这是一个创建于 1238 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个是 C++和 Python 混合编程的问题,所以严格来说似乎标题不准确?

    如同前几天发的帖子里所说,我仍在进行 cython 编程测试,为了在 C 的基本语法下在 cython 中复现一些 python 常见操作。

    比如以下这个场景:我在命名空间 main 中有一个数组(或者向量) a,我希望将 a 丢入某个函数处理过后,函数没有返回值,但 a 被修改,这种显然是传入一个指针,在 python 中类似于传入 list 或者 dict 的操作。

    测试代码如下:

    # distutils: language=c++
    import cython
    from libcpp.vector cimport vector
    
    cdef operation(vector[cython.float] *p):
        p.push_back(99)
    
    def main():
        # 首先准备一个向量 
        cdef vector[cython.float] lst
        cdef int i 
        for i in range(5):
            lst.push_back(i)
        # 丢入函数
        operation(&lst)
        # 查看结果
        print(lst)
    

    以上代码是能够运行的,返回结果[0,1,2,3,4,99],符合预期。 但是仍有一些疑惑,既然输入函数的&lst 是指针的话,那 operation 函数中调用这个指针值的时候,不是应该前面加星号才能取到实际对象么,所以不是应该是\*p.push_back(99)才能生效才对,为什么不需要加也能运行呢。

    其次将上文中 operation 函数内容修改为 p[0] += 1,上次尝试新增项目,这次尝试修改项目,期望返回值为[1,1,2,3,4],然而编译报错

    test.cpp(1191): error C2676: 二进制“+=”:“std::vector<float,std::allocator<_Ty>>”不定义该运算符或到
    预定义运算符可接收的类型的转换
            with
            [
                _Ty=float
            ]
    

    为什么会报错,两者有什么区别呢?

    3 条回复    2020-12-03 17:42:21 +08:00
    Jabin
        1
    Jabin  
       2020-12-03 09:04:17 +08:00
    operation *p 是指针,传入参数&lst 是地址,*p 指向 lst 地址,p[0] 是 lst[0]的地址+1 重新赋值,指向哪里就不知道了
    sujin190
        2
    sujin190  
       2020-12-03 09:47:34 +08:00
    你得看 cython 转换成 c 调用 gcc 编译时的代码是啥样的,也许 cython 的语法就是这样的呢
    black11black
        3
    black11black  
    OP
       2020-12-03 17:42:21 +08:00 via Android
    @Jabin p0 是可以取值的比如 print p0 这种是可以执行的,但是不能加一,就很怪
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3209 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 12:32 · PVG 20:32 · LAX 05:32 · JFK 08:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.