数组

来源:互联网 发布:大学生旅游的地方知乎 编辑:程序博客网 时间:2024/05/19 14:18

什么是数组?

数组就是相同类型变量按一定顺序排列的集合

int a[10];其中a是什么类型?

a是数组类型 再详细一点说 就是int[10]类型 它表明10个元素是int类型的数组

a中具体有哪些元素?

a[0],a[1],a[2],...,a[9]

从a[0]到a[9],一共10个元素

如果使用a[10]会怎样?

1、编译器会发出警告 提示下标超过数组上限 但是仍旧可以使用数组 如下

        int Fibonacii[15],i;        Fibonacii[0]=0;        Fibonacii[1]=1;        for (i=2; i<15; ++i) {            Fibonacii[i]=Fibonacii[i-2]+Fibonacii[i-1];        }        for (i=0; i<15; ++i) {            NSLog(@"Fibonacii[%i]=%i",i,Fibonacii[i]);        }        Fibonacii[15]=610;        NSLog(@"Fibonacii[%i]=%i",i,Fibonacii[15]);        Fibonacii[i]=610;        NSLog(@"Fibonacii[%i]=%i",i,Fibonacii[i]);

注意这里for循环结束后下标i的值为15 已经超过数组上限 使用Fibonacii[15]会使编译器发出了警告 但是依然可以使用Fibonacii[15]赋值取值 这里使用Fibonacii[i] 编译器就不会发出警告 容易隐藏错误 其实这里的Fibonacii[i]已经不是数组元素了

这里重点说明一下 为什么像a[10]这样下标超过上限的数组可以访问

因为数组存放在计算机连续的内存空间中 比如

a[0]    a[1]    a[2]    a[3]  ...  a[8]    a[9]

XXXX XXXX XXXX XXXX ... XXXX XXXX

计算机要知道变量在内存中的位置 所以记第一个字节的地址  这里a一共占40个字节 由10个int元素组成 a[9]所在的地址XXXX之后还是有内存空间的 a[9]之后4个字节的内存地址 即第41个字节到第44个字节 计算机就认为是a[10] 同理a[100]也是可以访问的 但是这些内存空间是不安全里面的值是未知的 因为我们定义的是a[0]到a[10] 尽管之后数组计算机是认可的

2、如果数组元素是类的实例 并且使用赋值取值 程序直接崩溃 原因是无法识别的方法送入了实例 如下

        int j;        fracs[0]=[[Fraction alloc] init];        fracs[1]=[[Fraction alloc] init];        [fracs[0] setNumerator:1 andDenominator:2];        [fracs[1] setNumerator:1 andDenominator:3];        for (j=2; j<15; ++j) {            fracs[j]=[fracs[j-2] add:fracs[j-1]];        }        for (j=0; j<15; ++j) {            NSLog(@"fracs[%i]=%i/%i",j,fracs[j].numerator,fracs[j].denominator);        }        fracs[i]=610;        NSLog(@"fracs[%i]=%i",j,fracs[j]);        [fracs[j] setNumerator:1 andDenominator:2];        NSLog(@"fracs[%i]=%i/%i",j,fracs[j].numerator,fracs[j].denominator);

这里for循环结束后下标i的值也超过了数组上限 只是使用fracs[j]作为普通类型操作 编译器会警告报错 但是如果作为类的实例去做赋值取值操作 程序就会崩溃

数组初始化

我们知道数组初始化有完全初始化和部分初始化 下面这种是部分初始化中的特殊情况 数组清零

int a[10]={};数组中的所有元素全部设置为0

数组赋值

数组不能整体赋值 只能给数组的每个元素分别赋值

int a[5];

a={0,1,2,3,4};是错误的 包括下面这种也是整体赋值

int b[5];

b=a;

sizeof()可以对类型或对象使用 返回字节大小 如下

        NSLog(@"%li",sizeof(int));        NSLog(@"%li",sizeof(short));        NSLog(@"%li",sizeof(long));        NSLog(@"%li",sizeof(long long));        NSLog(@"%li",sizeof(float));        NSLog(@"%li",sizeof(double));        NSLog(@"%li",sizeof(long double));        NSLog(@"%li",sizeof(char));        NSLog(@"%li",sizeof(NSString *));        NSLog(@"%li",sizeof(BOOL));        NSLog(@"%li",sizeof(enum direction));        NSLog(@"%li",sizeof(int[3][4]));        NSLog(@"%li",sizeof(n)/sizeof(n[0][0]));        NSLog(@"%li",sizeof(n)/sizeof(i));        NSLog(@"%li",sizeof(Fraction *));        Fraction *frac=[[Fraction alloc] init];        NSLog(@"%li",sizeof(frac));

2015-04-16 17:32:25.650 Array[1309:303] 42015-04-16 17:32:25.651 Array[1309:303] 22015-04-16 17:32:25.652 Array[1309:303] 82015-04-16 17:32:25.653 Array[1309:303] 82015-04-16 17:32:25.653 Array[1309:303] 42015-04-16 17:32:25.654 Array[1309:303] 82015-04-16 17:32:25.654 Array[1309:303] 162015-04-16 17:32:25.655 Array[1309:303] 12015-04-16 17:32:25.655 Array[1309:303] 82015-04-16 17:32:25.656 Array[1309:303] 12015-04-16 17:32:25.656 Array[1309:303] 42015-04-16 17:32:25.657 Array[1309:303] 482015-04-16 17:32:25.658 Array[1309:303] 122015-04-16 17:32:25.658 Array[1309:303] 122015-04-16 17:32:25.659 Array[1309:303] 82015-04-16 17:32:25.660 Array[1309:303] 8

long long类型字节大小是8 指针类型都是8 枚举类型是4

这点需要注意 数组可以通过sizeof()求出数组中有多少个元素 sizeof(数组变量)/sizeof(数组元素)或者sizeof(数组变量)/sizeof(变量)

C字符串%s和字符串结束符'\0' 如下

        char g[]={'a','b','c','d','e','f','g','h','i','j','\0'};        printf("%s\n",g);

C语言中没有字符串类型 但是提供了输入输出字符串%s 就是将字符整串输入输出 而在字符数组结尾加上字符串结束符就产生了字符串 '\0'本身占一个字符 上面字符数组有11个元素 即使不加 只要是以字符串输入输出系统也会自动加上 结果为abcdefghij

                                             
0 0
原创粉丝点击