This probably ought to work (I think we should import a1 as UnsafeMutablePointer<CInt>, but it looks like we simply don't). As a work-around you can make explicit that it's "really just a pointer":
car.h
extern int i1;
extern int *a1p;
car.c
int a1[] = { 1, 2, 3 };
int a1p = a1;
main.swift
// a1p is imported as UnsafeMutablePointer<CInt>!
a1p[1] // 2
If you can spare a few moments, this would be worth writing up on bugs.swift.org. Otherwise, I'll probably do so sometime later today.
I haven't investigated, but my guess is that the importer simply doesn't implement support for array-of-unspecified-length declarations, as they're a somewhat niche feature of C (in particular, they're not used much--or at all?--in Apple's SDK headers). This should be pretty easy to implement (basically we just need to teach the importer that it's just a pointer), so there's a fairly high chance of it getting fixed if you file a bug report =)
Doing a little archaeology, I find the following (lib/ClangImporter/ImportType.cpp:487):
ImportResult VisitArrayType(const clang::ArrayType *type) {
// FIXME: Array types will need to be mapped differently depending on
// context.
return Type();
}
With the commit message (Dec. 2012) from @Douglas_Gregor "C array types effectively have different behavior in different contexts; don't try to map them now." So this may be a little bit thornier to resolve than I thought at first, but we should still still probably do it (but: I'm not entirely convinced that simply decaying them to Unsafe[Mutable]Pointer<T> isn't the best option).