将指针数组传递给C函数

时间:2018-11-13 09:51:56

标签: c pointers

我在将指针数组传递给函数时遇到麻烦。我将发布一个简单的示例,但仍然对我不起作用。你能告诉我我在做什么错吗?

import time
from datetime import datetime
from calendar import timegm
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, String, Integer, DateTime, TypeDecorator, create_engine


class Timestamp(TypeDecorator):
    impl = DateTime

    def process_bind_param(self, value, dialect):
        if value is None:
            return
        elif isinstance(value, datetime):
            return value
        elif isinstance(value, (int, float)):
            return datetime.utcfromtimestamp(value)
        raise TypeError("Any form of time object required, but received {}".format(type(value).__name__))

    def process_result_value(self, value, dialect):
        if value is None:
            return None # support nullability
        elif isinstance(value, datetime):
            return float(timegm(value.timetuple()))
        raise vn.ValidationTypeError("datetime object required, but received {}".format(type(value).__name__))


Base = declarative_base()

class SystemLog(Base):
    __tablename__ = 'systemlog'
    id = Column(Integer, primary_key=True)
    time = Column(Timestamp, index=True, nullable=False, default=datetime.utcnow)
    type = Column(String(20))
    message = Column(String(2000))


engine = create_engine('sqlite://')
Session = sessionmaker(bind=engine)

s = Session()
Base.metadata.create_all(engine)
s.commit()

start_time = time.time()
sample_data = [SystemLog(time=start_time + i) for i in xrange(10000)]
s.add_all(sample_data)
s.commit()

2 个答案:

答案 0 :(得分:2)

您有两个问题:

  1. 数组索引从零开始。也就是说,由N个元素组成的数组的索引从0N - 1(含)

  2. 声明int *v[1]声明v为指向int的一个指针的数组,而不是指向指向一个int的数组的指针。那将是int (*v)[1]。这也是&v函数中main的类型。

第二个问题的解决方案(使用正确的类型)然后导致第三个问题,因为这意味着*v[0]由于operator precedence而错误。您也需要在此处使用括号,例如(*v)[0]


但是 第二个问题(以及后面的第三个问题)是有争议的,因为您不需要“通过引用”传递数组。

数组自然衰减到指向第一个元素的指针。当使用纯v且预期指向int的指针时,编译器会自动将其转换为&v[0]

这意味着您可以声明函数以简单地将int *作为参数,并简单地将普通v作为参数。

答案 1 :(得分:1)

首先,请注意,实例化基于C语言中的0,即,第一个(并且,在您为您自己的情况下)元素是v[0]

关于传递它,只需将参数定义为指向int的指针,即int*。类型为int[1]的变量在传递给函数时将衰减为指向int的指针(因此,无需编写transformare(&v)及其transformare(v)

int transformare(int *v)
{
    v[0] = 10;
    return 0;
}

int main()
{
    int v[1];
    printf("n = ");
    scanf("%d", &v[0]);
    transformare(v);
    printf("%d", v[0]);
    return 0;
}