指针详解
以下实例, 以三个典型的面试题, 展示指针的原理;
如果能理解以下实例, 指针就没问题了!!!
#import <Foundation/Foundation.h>
/**
* (&array + 1) VS (p + 1) ---- 看跨度
*/
void test1 ()
{
int array[4] = {10, 20, 30, 40};
int *p = (int *)(&array + 1);
NSLog(@"test1 - %d", *(p - 1));
// 2015-10-14 16:53:42.290 指针的问题[27364:1585274] test1 - 40
}
/**
* 指针类型 决定其 跨度
*/
void test2 ()
{
int array[4] = {10, 20, 30, 40};
double *p = (double *)(&array + 1); // 跨越16字节, 指向下一个 10
NSLog(@"test2 - %d", *(int *)(p - 1)); // 跨越 8字节, 返回 两个元素, 30
// 2015-10-14 16:53:42.290 指针的问题[27364:1585274] test2 - 30
}
/**
* 二维数组
*/
void test3 ()
{
int a[2][3] = {{1, 2, 3}, {10, 20, 30}};
int *p = (int *)(a + 1);
NSLog(@"test3 - %d", *(p - 2)); // +12 --- -8
// 2015-10-14 17:13:55.327 指针的问题[27395:1593840] test3 - 2
a[0]; // a[0][0]的地址, 指向元素a[0][0]的指针, 指向4个字节的空间
a[1]; // a[1][0]的地址, 指向元素a[1][0]的指针, 指向4个字节的空间
a; // a[0]的地址, 指向a[0]的指针, 指向 3 * 4 个字节的空间
&a; // a 的地址, 指向a 的指针, 指向 6 * 4 个字节的空间
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
int array[4] = {10, 20, 30, 40};
// q - 一个指向 array首元素的指针, 指向四个字节的空间
int *q = array;
// (*p)[4] - 指向数组的指针, 指向 16 个字节的空间
int (*q1)[4] = &array;
NSLog(@"%p --- %p", q, q1);
// +1, 地址跨度不一样
NSLog(@"%p --- %p", ++q, ++q1);
// 0x7fff5fbff780 --- 0x7fff5fbff780
// 0x7fff5fbff784 --- 0x7fff5fbff790
// 1. 测试 -- 元素指针, 数组指针
test1();
// 2. 测试 - 二
test2();
// 3. 二维数组
test3();
// array, &array, &array[0] 是同一个地址
// NSLog(@"%p --- %p",array, &array);
// NSLog(@"%p",&array[0]);
// NSLog(@"%p",&array[1]);
// NSLog(@"%p",&array[2]);
// NSLog(@"%p",&array[3]);
// p -> 数组名, 代表首元素地址, --认为: 指向首元素的地址
int *p = array;
// p1 -> 第0个元素的地址
// int *p1 = &array[0];
for (int i = 0; i < 4; i++) {
// NSLog(@"%d -- %p",*(p + i), &array[i]);
}
}
return 0;
}