指针相关的问题

指针p的加减法运算

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

数组名

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

其他结论

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

int 是4个字节
float 是8个字节
例如:

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

结果是

 0x7fff5fbff790 0x7fff5fbff794
 0x7fff5fbff790 0x7fff5fbff7a0

原因:

  • numbers : 相当于&numbers[0],等价于指向numbers[0]的指针,所以numbers + 1 就相当于numbers【0】指针的地址+ numbers[0]类型数据是4个字节数,所以numbers,numbers+1 就是差别是4个字节

  • &numbers : 等价于指向numbers数组的指针(是整个数组的指针),整个数组的跨度的就是4个int 类型的就是16个字节,所以&numbers ,&numbers+1 就差16个字节的地址

  • 2

 int numbers[2][2] = {
            {10, 20}, 
            {11, 22} 
        };
  NSLog(@"%p %p", numbers[0], numbers[0] + 1);
   NSLog(@"%p %p", &numbers, &numbers + 1);

结果是

0x7fff5fbff790 0x7fff5fbff794
 0x7fff5fbff790 0x7fff5fbff7a0

原因:

  • numbers[0] == &numbers[0][0],相当于是一个指向numbers[0][0]的指针(也就是是一个int 类型的指针),所以numbers[0] + 1,和numbers[0]才会差别4个字节的地址
  • &numbers : 等价于指向numbers数组的指针(是整个数组的指针),整个数组的跨度的就是4个int 类型的就是16个字节,所以&numbers ,&numbers+1 就差16个字节的地址

你可能感兴趣的:(指针相关的问题)