我想得到这个结构
CGPoint addLines1[] = { CGPointMake(30.0, 150.0), CGPointMake(41.67, 145.19), CGPointMake(53.33, 103.25), CGPointMake(65.0, 131.67), CGPointMake(76.67, 106.11), CGPointMake(88.33, 110.20), CGPointMake(100.0, 111.54), CGPointMake(111.67, 112.13), CGPointMake(123.33, 115.66), CGPointMake(135.0, 123.7), CGPointMake(146.67, 125.53), CGPointMake(158.33, 115.1), CGPointMake(170.0, 69.38), CGPointMake(181.67, 112.47), CGPointMake(193.33, 65.1), CGPointMake(205.0, 103.33), CGPointMake(216.67, 92.6), CGPointMake(228.33, 54.76), CGPointMake(240.0, 79.66), CGPointMake(251.67, 53.81), CGPointMake(263.33, 56.81), CGPointMake(275.0, 88.19), CGPointMake(286.67, 74.81), CGPointMake(298.33, 28.1), CGPointMake(310, 20.0), };
为了进行一些计算和绘制数据.
我有 CGPoint *lines = appDelegate.averageResponseTimePoints;
如何使阵列addLines[]
从*lines
?
对于iOS:
创建数组:
NSArray *myCGPointArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];
获取第一个CGPoint对象:
CGPoint myPoint = [myCGPointArray[0] CGPointValue];
C数组在运行时不是真正的数组,它们只是指向相同类型的连续对象块的指针.当你看到items[n]
,这只是语法糖*(items+n)
.
在你的例子addLines[1]
中将是*(lines+1)
,addLines[0]
将来*(lines+0)
,是*lines
.所以,addLines
就是lines
没有指针取消引用.*lines
是数组中的第一个项目,lines
是整个数组.
数组在编译时与指针有一些差异.例如,sizeof(addLines)
会给你整个数组的大小.
一旦将数组传递到可能变量大小的某个位置,Array-ness就会丢失,但您仍然可以使用下标运算符.例如:
#include#define showsize( expr ) ( printf(#expr " = %zd\n", ( expr ) ) ) CGPoint * pass_back(CGPoint points[4]) { showsize(sizeof(points)); return points; } int main(void) { CGPoint square[] = {CGPointMake(-1.0, 1.0), CGPointMake( 1.0, 1.0), CGPointMake( 1.0, -1.0), CGPointMake(-1.0, -1.0)}; CGPoint* returned; int i; showsize(sizeof(CGPoint)); showsize(sizeof(CGPoint*)); showsize(sizeof(square)); returned = pass_back(square); showsize(sizeof(returned)); for (i = 0; i < 4; ++i) { printf("returned[%d] = {%0.1f, %0.1f}\n", i, (float) returned[i].x, (float) returned[i].y); } return 0; }
这会在我的Mac上输出以下内容:
sizeof(CGPoint) = 8 sizeof(CGPoint*) = 4 sizeof(square) = 32 sizeof(points) = 4 sizeof(returned) = 4 returned[0] = {-1.0, 1.0} returned[1] = {1.0, 1.0} returned[2] = {1.0, -1.0} returned[3] = {-1.0, -1.0}
这里square
是四个CGPoint
s 的大小,但是一旦发送到pass_back
函数,它只是一个指针的大小,因为它就是它.当指针返回(并命名returned
)时,它仍然可以像数组一样使用.
注意4
循环中的幻数.指针不知道它指向的数组的长度.
无法与=
运算符重新分配数组.如果你真的必须填充addLines
点lines
,你可以使用以下内容:
memcpy(addLines, lines, sizeof(CGPoint) * numberOfPoints);
你必须numberOfPoints
从某个地方获得,并且addLines
必须足够大才能处理这些点.如果点的数量是常数,那也没关系,但如果点的数量在运行时可能会有所不同,那将会很糟糕,特别是如果这些点来自外部世界(想想任意代码执行).
我会averageResponseTimePoints
改为返回NSArray而不是C风格的数组.您需要将CGPoint
s 封装在对象中 - 您自己的对象或NSValue
s.
以下是您可以编写的示例averageResponseTimePoints
:
- (NSArray*) averageResponseTimePoints { NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease]; for (int i = 0; i < numberOfPoints; ++i) { NSValue* point = [NSValue value:points+i withObjCType:@encode(CGPoint)]; [result addObject:point]; } return result; }
如果您的代码使用CocoaTouch运行,则可以使用它来创建点值:
NSValue* point = [NSValue valueWithCGPoint:points[i]];
要从CGPoint
数组中获取s,您可以编写如下内容:
for (NSValue* value in result) { NSPoint pt; [value getValue:&pt]; NSLog(@"%f %f", pt.x, pt.y); }
或者使用CocoaTouch:
CGPoint pt = [value CGPointValue];