Objective-C数组用法介绍 – Objective-C开发教程

上一章Objective-C开发教程请查看:Objective-C数字对象NSNumber
数组是Objective-C最基本的数据结构,数组是一个数据集合,集合中的每个数组的类型都是相同的,并且数组的大小是固定的,不能动态改变。
数组在内存中的储存方式:具有连续储存空间,最低地址指向第一个元素,最高地址指向最后一个元素,函数名相当于首指针。第一个元素的索引为0,最后一个元素的索引为n-1。
数组作为基本的数据结构,最基本的操作包括:增删改查,下面我们从最基本的开始讲起。
数组声明OC中声明数组的语法如下:

type array[size];

其中type为数据类型,array为数组名,size为数组大小,如果同时定义和初始化数组,则size可省略掉。
例如下面语句声明并创建具有10个元素的数组:
double balance[10];

数组初始化你可以使用一个或多个数据对数组进行初始化,如下语句:
double balance[3] = {20.0, 30.23, 56.09}; // 或 double balance[] = {20.0, 30.23, 56.09};

我们可以使用索引对数组中的数据进行更改,如下:
balance[0] = 100.98; balance[2] = 13.69;

访问数组元素我们可以通过索引来访问数组元素,假设数组有n个元素,第一个元素的索引为0,最后一个为n-1,如下:
double salary = balance[9];

上面的语句将从数组中获取第10个元素,并将值赋给salary变量。下面是一个示例,它将使用上述三个概念,即声明、赋值和访问数组:
#import < Foundation/Foundation.h> int main () { int n[10]; /* n数组包含10个元素 */ int i,j; /* 初始化数组 */ for ( i = 0; i < 10; i++ ) { n[ i ] = i + 100; }/* 输出每个数组元素的值 */ for (j = 0; j < 10; j++ ) { NSLog(@"Element[%d] = %d\n", j, n[j] ); } return 0; }

多维数组n维数组的的声明语法如下:
type name[size1][size2]...[sizeN];

例如,下面的声明创建了一个三维的5、10、4整数数组:
int threedim[5][10][4];

二维数组
多维数组最简单的形式是二维数组。二维数组本质上是一维数组的列表。要声明一个大小为x、y的二维整数数组,可以这样写—
type arrayName [ x ][ y ];

类型type可以是任何有效的Objective-C数据类型,arrayName将是有效的Objective-C标识符。二维数组可以看作是一个表,其中有x行数和y列数。一个包含三行四列的二维数组A可以表示为-
Objective-C数组用法介绍 &#8211; Objective-C开发教程

文章图片
【Objective-C数组用法介绍 – Objective-C开发教程】因此,数组a中的每个元素都由a[i][j]的元素名标识,其中a是数组的名称,i和j是唯一标识a中每个元素的下标。
初始化二维数组
可以通过为每一行指定括号中的值来初始化多维数组,下面是一个3行4列的数组。
int a[3][4] = { {0, 1, 2, 3} ,/*第一行 */ {4, 5, 6, 7} ,/*第二行 */ {8, 9, 10, 11}/*第三行 */ };

嵌套大括号(指示要使用的行)是可选的。下面的初始化与前面的例子相同:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

访问二维数组元素
二维数组中的元素可以通过下标来访问,即,数组的行索引和列索引。例如?
int val = a[2][3];

上面的语句将从数组的第三行获取第4个元素。你可以在上面的图表中验证它。让我们检查下面的程序,我们已经使用嵌套循环来处理一个二维数组:
#import < Foundation/Foundation.h> int main () {int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; int i, j; for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 2; j++ ) { NSLog(@"a[%d][%d] = %d\n", i,j, a[i][j] ); } }return 0; }

在Objective-C中将数组作为函数参数传递如果你想通过一个一维数组作为参数的函数,你必须在下列三种方式之一的声明函数的形式参数和三个声明方法产生相似的结果,因为每个告诉编译器,一个整数的指针将被接受。类似地,可以将多维数组作为形式参数传递。
方式一:作为指针的形式参数如下,你将在下一章学习什么是指针。
- (void) myFunction(int *) param { . . . }

方式二:形式参数的大小数组如下-
- (void) myFunction(int [10] )param { . . . }

方式三:形式参数作为一个无大小的数组如下-
-(void) myFunction: (int []) param { . . . }

例子
现在,考虑下面的函数,它将一个数组与另一个参数一起作为参数,并根据传递的参数返回数组的数字的平均值,如下所示
-(double) getAverage:(int []) arr andSize:(int) size { inti; double avg; double sum; for (i = 0; i < size; ++i) { sum += arr[i]; }avg = sum / size; return avg; }

现在,让我们这样调用上面的函数:
#import < Foundation/Foundation.h> @interface SampleClass:NSObject-(double) getAverage:(int []) arr andSize:(int) size; @end@implementation SampleClass-(double) getAverage:(int []) arr andSize:(int) size { inti; double avg; double sum =0; for (i = 0; i < size; ++i) { sum += arr[i]; }avg = sum / size; return avg; }@end int main () {int balance[5] = {1000, 2, 3, 17, 50}; double avg; SampleClass *sampleClass = [[SampleClass alloc]init]; avg = [sampleClass getAverage:balance andSize: 5] ; NSLog( @"Average value is: %f ", avg ); return 0; }

在Objective-C中从函数中返回数组Objective-C编程语言不允许返回整个数组作为函数的参数。但是,可以通过指定不带索引的数组名称来返回指向数组的指针。
如果你想从一个函数中返回一个单维数组,你必须声明一个函数返回一个指针,如下面的例子所示:
int * myFunction() { . . . }

要记住的第二点是Objective-C并不主张将局部变量的地址返回到函数外部,因此你需要将局部变量定义为静态变量。
现在,考虑下面的函数,它将生成10个随机数,并使用数组返回它们,并按如下方式调用这个函数:
#import < Foundation/Foundation.h>@interface SampleClass:NSObject - (int *) getRandom; @end@implementation SampleClass- (int *) getRandom { static intr[10]; int i; srand( (unsigned)time( NULL ) ); for ( i = 0; i < 10; ++i) { r[i] = rand(); NSLog( @"r[%d] = %d\n", i, r[i]); }return r; }@endint main () {int *p; int i; SampleClass *sampleClass = [[SampleClass alloc]init]; p = [sampleClass getRandom]; for ( i = 0; i < 10; i++ ) { NSLog( @"*(p + %d) : %d\n", i, *(p + i)); }return 0; }

指向Objective-C中的数组的指针假设你对Objective-C编程语言中的指针有一点了解,让我们开始:数组名是指向数组第一个元素的常量指针。
double balance[50];

balance是指向& balance[0]的指针,它是数组balance的第一个元素的地址。因此,下面的程序片段分配给p的地址位balance。
double *p; double balance[10]; p = balance;

使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4)是访问balance[4]数据的合法方法。
一旦将第一个元素的地址存储在p中,就可以使用*p、*(p+1)、*(p+2)等访问数组元素。下面的例子说明了上面所讨论的一切概念:
#import < Foundation/Foundation.h>int main () {double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; int i; p = balance; NSLog( @"使用指针的数组值\n"); for ( i = 0; i < 5; i++ ) { NSLog(@"*(p + %d) : %f\n",i, *(p + i) ); }NSLog(@"使用balance作为地址的数组值\n"); for ( i = 0; i < 5; i++ ) { NSLog(@"*(balance + %d) : %f\n",i, *(balance + i) ); } return 0;

    推荐阅读