【IOS 开发】Object - C 数组使用详解

.

一. 一维数组

1. 一维数组定义

(1) 数组定义

数组定义格式 : type arrayName[len];

-- 默认初始化 : 注意 数组定以后, 如果是 int 数组默认初始化为 0, 如果是浮点型 默认元素为 0.0, 如果是 指针类型数组 默认类型 null;

(2) 数字地址计算

数组元素地址性质 : 数组元素是连续存放的;

-- 数组首地址 : 数组变量是一个指针, 其存放了数组中元素的首地址;

-- 元素地址计算公式 : 元素地址 = 数组首地址 + 数组元素所占内存大小 * 元素索引值;

2. 数组初始化

指定数组元素个数 :

-- 全部初始化 : 对数组的所有的元素进行初始化;

-- 部分初始化 : 对数组中的一部分元素进行初始化;

不指定数组个数 : 如果不指定数组个数, 定义时必须初始化, 会根据初始化的元素个数自动推断数组长度;

数组长度计算 : sizeof(arrayName) / sizeof(arrayName[0]);

3. 代码示例

代码示例 :

-- 代码内容 :

/*************************************************************************
    > File Name: 12-oneArray.m
    > Author: octopus
    > Mail: octopus_truth.163.com
    > Created Time: 日 12/ 7 16:30:31 2014
 ************************************************************************/

#import <Foundation/Foundation.h>

int main(int argc, char * argv[])
{
	@autoreleasepool {
		//定义数组格式 type arrayName[length]
		int array[5];	

		//定义长度, 完全赋值
		int array1[5] = {0, 1, 2, 3, 4};

		//定义长度, 不完全赋值
		int array2[5] = {0, 1, 2};

		//不定义长度, 必须初始化
		int array3[] = {0, 1, 2};

		//定义 C语言字符串数组
		char * array4[] = {"csdn", "octopus", "hello"};

		//定义 Object-C 字符串数组
		NSString *array5[] = {@"csdn", @"octopus", @"hello"};

		//遍历 array2
		for(int i = 0; i < sizeof(array2) / sizeof(array2[0]); i ++)
		{
			NSLog(@"array2[%d] = %d", i, array2[i]);
		}
	}
}

-- 执行结果 :

octopus-2:oc octopus$ clang -fobjc-arc -framework Foundation 12-oneArray.m
octopus-2:oc octopus$ ./a.out
2014-12-07 16:38:58.238 a.out[379:507] array2[0] = 0
2014-12-07 16:38:58.241 a.out[379:507] array2[1] = 1
2014-12-07 16:38:58.242 a.out[379:507] array2[2] = 2
2014-12-07 16:38:58.242 a.out[379:507] array2[3] = 0
2014-12-07 16:38:58.243 a.out[379:507] array2[4] = 0

三. 多维数组

1. 二维数组定义

二维数组定义格式 : type arrayName[rowLength][columnLength];

-- 数组长度 : 左侧的数字 rowLength 是 一维数组的个数, 即有几行;

2. 多维数组初始化

几种初始化方式 : 示例 int array[3][5];

-- 初始化全部二级数组 : 可以为其初始化 3 个一维数组, 一维数组中得元素个数随意;

-- 初始化部分二级数组 : 可以为其初始化 少于 3 个一维数组, 只初始化一部分;

-- 省略二维数组长度 : 如果在声明数组时进行初始化, 那么可以省略数组的 第一个 数组长度;

-- 省略初始化时的二级数组括号 : 一维数组的括号可以省略, 系统会自动默认初始化的部分自动填充;

3. 示例

代码示例 :

-- Object-C 代码 :

/*************************************************************************
    > File Name: 12-multiArray.m
    > Author: octopus
    > Mail: octopus_truth.163.com
    > Created Time: 四 12/11 00:59:14 2014
 ************************************************************************/

#import <Foundation/Foundation.h>

int main(int argc, char * argv[])
{
	@autoreleasepool {

		printf("1. 初始化全部数组的部分内容\n");
		int array1[3][5] = {
		{1, 2},
		{5, 7, 7},
		{2, 4}
		};

		for(int i = 0; i < sizeof(array1)/sizeof(array1[0]); i ++)
		{
			for(int j = 0; j < sizeof(array1[0])/sizeof(array1[0][0]); j ++)
			{
				printf("%d\t", array1[i][j]);
			}
			printf("\n");
		}

		printf("\n2. 初始化部分数组的部分内容\n");
		int array2[3][5] = {
		{1, 2, 4, 6, 7},
		{1}
		};

		for(int i = 0; i < sizeof(array2)/sizeof(array2[0]); i ++)
		{
			for(int j = 0; j < sizeof(array2[0])/sizeof(array2[0][0]); j ++)
			{
				printf("%d\t", array2[i][j]);
			}
			printf("\n");
		}

		printf("\n3. 省略数组的长度\n");
		int array3[][5] = {
		{1, 2, 4, 6, 7},
		{1}
		};

		for(int i = 0; i < sizeof(array3)/sizeof(array3[0]); i ++)
		{
			for(int j = 0; j < sizeof(array3[0])/sizeof(array3[0][0]); j ++)
			{
				printf("%d\t", array3[i][j]);
			}
			printf("\n");
		}

		printf("\n4. 省略数组的大括号\n");
		int array4[][5] = {
		1, 2, 4, 6, 7,
		1
		};

		for(int i = 0; i < sizeof(array4)/sizeof(array4[0]); i ++)
		{
			for(int j = 0; j < sizeof(array4[0])/sizeof(array4[0][0]); j ++)
			{
				printf("%d\t", array4[i][j]);
			}
			printf("\n");
		}
	}
}

-- 执行结果 :

octopus-2:oc octopus$ clang -fobjc-arc -framework Foundation 12-multiArray.m
octopus-2:oc octopus$ ./a.out
1. 初始化全部数组的部分内容
1	2	0	0	0
5	7	7	0	0
2	4	0	0	0	

2. 初始化部分数组的部分内容
1	2	4	6	7
1	0	0	0	0
0	0	0	0	0	

3. 省略数组的长度
1	2	4	6	7
1	0	0	0	0	

4. 省略数组的大括号
1	2	4	6	7
1	0	0	0	0

三. 字符串, 字符数组 与 字符串相关函数

1. NSLog 与 printf 对比

NSLog 与 printf 对比 :

-- 输出字符串格式不同 : printf 输出 C 语言格式字符串, 如 "string", NSLog 输出 Object-C 字符串, 如 @"string" ;

-- NSLog 有多余操作 : NSLog 会自动添加 日期 时间 自动换行 等操作;

示例 :

/*************************************************************************
    > File Name: 12-NSLogVSprintf.m
    > Author: octopus
    > Mail: octopus_truth.163.com
    > Created Time: 四 12/11 01:18:17 2014
 ************************************************************************/

#import <Foundation/Foundation.h>

int main(int argc, char * argv[])
{
	@autoreleasepool {
		NSLog(@"这是 NSLog 输出的字符串");
		printf("这是 printf 输出的字符串");
	}
}

-- 执行结果 :

octopus-2:oc octopus$ clang -fobjc-arc -framework Foundation 12-NSLogVSprintf.m
octopus-2:oc octopus$ ./a.out
2014-12-11 01:19:07.370 a.out[1925:507] 这是 NSLog 输出的字符串
这是 printf 输出的字符串octopus-2:oc octopus$ 

2. 字符数组 和 字符串

定义字符数组方式 : 下面的两种方法是等价的;

-- 使用字符串初始化 : char array[] = "fuck", 使用这种方法定以后, 会在后面自动加上 ‘\0‘;

-- 使用数组方式初始化 : char array[] = {‘f‘, ‘u‘, ‘c‘, ‘k‘, ‘\0‘};

关于字符数组的长度 : 一个由 4 个字符组成的数组, 其长度是 5, 后面还需要加上一个 ‘\0‘;

代码示例 :

/*************************************************************************
    > File Name: 12-charArray.m
    > Author: octopus
    > Mail: octopus_truth.163.com
    > Created Time: 四 12/11 01:27:12 2014
 ************************************************************************/

#import <Foundation/Foundation.h>

int main(int argc, char * argv[])
{
	@autoreleasepool {
		char char_array[] = "fuck";
		char char_array1[] = {
		‘f‘, ‘u‘, ‘c‘, ‘k‘, ‘\0‘
		};

		printf("char_array 大小 : %lu, char_array1 大小 : %lu\n", sizeof(char_array), sizeof(char_array1));
	}
}

-- 运行结果 :

octopus-2:oc octopus$ clang -fobjc-arc -framework Foundation 12-charArray.m
octopus-2:oc octopus$ ./a.out
char_array 大小 : 5, char_array1 大小 : 5

3. 常用的字符串处理函数

代码示例 :

-- 代码 :

/*************************************************************************
    > File Name: 12-strMethod.m
    > Author: octopus
    > Mail: octopus_truth.163.com
    > Created Time: 四 12/11 01:34:08 2014
 ************************************************************************/

 #include <string.h>
 #import <Foundation/Foundation.h>

int main(int argc, char * argv[])
{
	@autoreleasepool {
		char c = ‘1‘;
		char c1 = ‘A‘;
		char c2 = ‘a‘;
		char c3 = ‘\t‘;

		NSLog(@"字符相关函数");

		printf("c = %c  是否为数字或数字 : %d \n", c, isalnum(c));
		printf("c = %c 是否为字母 : %d\n", c, isalpha(c));
		printf("c = %c 是否为控制字符 : %d\n",c, iscntrl(c));
		printf("c = %c 是否为控制数字 : %d\n", c, isdigit(c));
		printf("c = %c 是否为可打印字符 : %d\n", c, isgraph(c));
		printf("c1 = %c 是否为小写字母 : %d\n", c1, islower(c1));
		printf("c1 = %c 是否为大写字母 : %d\n", c1, isupper(c1));
		printf("c1 = %c 是否为标点符号 : %d\n", c1, ispunct(c1));
		printf("c3 = %c 是否为空白字符 : %d\n", c3, isspace(c3));
		printf("c1 = %c 是否是十六进制字符 : %d\n", c1, isxdigit(c1));

		NSLog(@"字符串相关函数");

		char array[20] = "fuck";
		char array1[] = "bitch";

		//注意 字符串 array 要有足够的空间 存放 后面的 array1
		printf("%s 拼接字符串 \n", strcat(array, array1));

		printf("array 出现 c 的位置 %s \n", strchr(array, ‘c‘));

		printf("比较 array 与 array1 大小 : array 是否大于 array1 : %d\n", strcmp(array, array1));

	}
}

-- 执行结果 :

octopus-2:oc octopus$ clang -fobjc-arc -framework Foundation 12-strMethod.m
octopus-2:oc octopus$ ./a.out
2014-12-11 02:11:08.608 a.out[2164:507] 字符相关函数
c = 1  是否为数字或数字 : 1
c = 1 是否为字母 : 0
c = 1 是否为控制字符 : 0
c = 1 是否为控制数字 : 1
c = 1 是否为可打印字符 : 1
c1 = A 是否为小写字母 : 0
c1 = A 是否为大写字母 : 1
c1 = A 是否为标点符号 : 0
c3 = 	 是否为空白字符 : 1
c1 = A 是否是十六进制字符 : 1
2014-12-11 02:11:08.610 a.out[2164:507] 字符串相关函数
fuckbitch 拼接字符串
array 出现 c 的位置 ckbitch
比较 array 与 array1 大小 : array 是否大于 array1 : 4
时间: 2024-10-11 00:47:48

【IOS 开发】Object - C 数组使用详解的相关文章

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

iOS开发——多线程OC篇&amp;多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

iOS开发——实用技术OC篇&amp;事件处理详解

事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic,readonly) UIEventSubtype  subtype; 事件产生的时间 @property(nonatomic,readonly) NSTimeInterval  timestamp; 事件传递 - hitTest:withEvent: SWIFT func hitTest(_ po

iOS开发——屏幕适配篇&amp;Masonry详解

Masonry详解 前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变 在iphone5-iphone5s时代 window的size变了(320,5

iOS开发——UI篇OC&amp;transform详解

transframe属性详解 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffineTransformMakeTranslation(平移) CGAffineTransformMakeScale(缩放) CGAffineTransformMakeRotation(旋转) (2) 创建“基于transform参数”的形变 CGAffineTra

ios开发——实战OC篇&amp;FMDB详解

FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入,并使用 libsqlite3.dylib 依赖包. F

iOS开发中UIPopoverController的使用详解

这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤

iOS开发的沙盒机制详解

在iOS平台上,每个app都有一个存储空间,用以存储照片.声音文件.文本.属性列表等,我们称之为沙盒.在沙盒里,app可以自己读写文件,但仅限于自己的沙盒,不可访问其他app沙盒,不可进行相互间通信,除非通过URL Scheme. 在iOS开发中,Documents.Library.temp都是沙盒的根目录结构,但是他们三者之间有什么区别呢? Documents: 用于存储用户数据,iTunes备份和恢复的时候会包括此目录,所以,iOS开发者一般将程序中建立的或在程序中浏览到的文件数据保存在该目

iOS开发- 项目重命名(图文详解)

ps: 拉票啦~ 我参加了2014博客之星评选比赛, 麻烦大家帮忙投下票http://vote.blog.csdn.net/blogstar2014/details?username=hitwhylz#content 前言:在IOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译不了.所以各位重命名项目时,记得先备份好一份噢.本文我会介绍一种方法,是我自己参考