指针

作者: zhazha | 来源:发表于2015-07-08 07:55 被阅读86次

    指针经典题

    思考:以下小程序,输出结果是多少?

        int numbers[4] = {10, 20, 30, 40, 50};
    
        int *p = (int *)(&numbers + 1);
    
        NSLog(@"%d", *(p - 1));
    

    思路分析

    首先分析一维数组

        int numbers[4] = {10, 20, 30, 40};
    
        NSLog(@"%p %p", numbers, numbers + 1);
        NSLog(@"%p %p", &numbers, &numbers + 1);
    
    • numbers : 存储的是数组首元素的地址,相当于&numbers[0],等价于指向numbers[0]的指针,所以numbers + 1的跨度是整型数据10所占用的字节数;
    • &numbers : 等价于指向numbers数组的指针,所以&numbers + 1的跨度是整个数组numbers所占用的字节数;

    其次分析二维数组

         int numbers[2][2] = {
             {10, 20}, // numbers[0]
             {11, 22} // numbers[1]
            };
    
    • numbers[0] == &numbers[0][0],相当于一个指向numbers[0][0]的指针;
    • numbers == &numbers[0],相当于一个指向numbers[0]的指针
    • &numbers == 相当于一个指向numbers的指针

    最后分析三维数组

        int numbers[2][2][2] = {
            {
                {10, 11},
                {12, 13}
             },
             {
                {14, 15},
                {16, 17}
             }
            };
    
    • numbers[0][0] == &numbers[0][0][0],相当于是一个指向numbers[0][0][0]的指针
    • numbers[1] == &numbers[1][0],相当于是一个指向numbers[1][0]的指针
    • numbers == &numbers[0],相当于是一个指向numbers[0]的指针
    • &numbers == 相当于是一个指向numbers的指针

    解答

        int numbers[4] = {10, 20, 30, 40, 50};
    
        int *p = (int *)(&numbers + 1);
    
        NSLog(@"%d", *(p - 1));
    
    • &numbers == 相当于是一个指向numbers的指针的指针,&numbers + 1的跨度为整个数组numbers的字节,(&numbers + 1)指向了数组的末尾
    • (int *)(&numbers + 1)将指向整个数组的指针强转为指针整型的指针,它的跨度为int类型的字节
    • (p - 1)是指向了数据最后一个数据的指针,*p取得得数据是50;

    结论

    指针p的加减法运算

    • 指针p + N
      • p里面存储的地址值 + N * 指针所指向类型的占用字节数
    • 指针p - N
      • p里面存储的地址值 - N * 指针所指向类型的占用字节数

    数组名

    • 存储的是数组首元素的地址
    • 等价于:一个指向数组首元素的指针
    • 数组名 + 1 的跨度:数组首元素的占用字节数

    其他结论

    • &num + 1的跨度:num的占用字节数

    相关文章

      网友评论

          本文标题:指针

          本文链接:https://www.haomeiwen.com/subject/lenyqttx.html