数组

什么是数组?

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值