首页 > 代码库 > 指针相关

指针相关

1、对形式参量使用 const

函数之所以可以改变数组的内容,是因为函数使用了指针,从而能够直接使用原始数据。

使用 const 并不要求原始数据是固定不变的;只是说明函数在处理const所定义数组时,应把数组当做是固定不变的。

  如果函数想修改数组,那么在声明参量时就不要使用 const ;如果函数不需要修改数组,那么在声明数组参量时最好使用const 。

2.指针与多维数组

2.1 指针与多维数组

  zippo[m][n] == *(*(zippo + m) + n) 

#include <stdio.h>
int main(void)
{
    int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5, 7} };
   
    printf("   zippo = %p,    zippo + 1 = %p\n",
               zippo,         zippo + 1);
    printf("zippo[0] = %p, zippo[0] + 1 = %p\n",
            zippo[0],      zippo[0] + 1);
    printf("  *zippo = %p,   *zippo + 1 = %p\n",
              *zippo,        *zippo + 1);
    printf("zippo[0][0] = %d\n", zippo[0][0]);
    printf("  *zippo[0] = %d\n", *zippo[0]);
    printf("    **zippo = %d\n", **zippo);
    printf("      zippo[2][1] = %d\n", zippo[2][1]);
    printf("*(*(zippo+2) + 1) = %d\n", *(*(zippo+2) + 1));
 
    return 0;
}
运算结果:
zippo=0x7fff5fbff8a0, zippo+1=0x7fff5fbff8a8
  zippo[0]=0x7fff5fbff8a0, zippo[0]+1=0x7fff5fbff8a4
 *zippo=0x7fff5fbff8a0, *zippo+1=0x7fff5fbff8a4

zippo[0][0] = 2
  *zippo[0] = 2
    **zippo = 2

      zippo[2][1] = 3
*(*(zippo+2) + 1) = 3
 
输出显示出二维数组 zippo 的地址和一维数组 zippo[0] 的地址是相同的,均为相应的数组首元素的地址。然而,差别也是有的。int 是4个字节长, zippo[0] 指向4字节长的数据对象,对 zippo[0] 加 1 导致它的值增加4 。数组名 zippo 是包含两个 int 数的数组的地址,因此它指向 8 字节长的数据对象,对 zippo 加 1 导致它的值增加8 。
 

 分析 *(*(zippo+2) + 1)

zippo第1个大小为 2 个 int 的元素的地址
zippo+2第3个大小为 2 个 Int 的元素的地址
*(zippo+2)第3个元素,即包含2个 int 值的数组,因此也是其第1个元素(int 值)的地址
*(zippo+2)+1包含2个 int 值的数组的第2个元素(int 值)的地址
*(*(zippo+2)+1)数组第3行第2个 int 的值(zippo[2][1])
 

2.2 指向多维数组的指针

  int (* pz) [2]; //pz 指向一个包含2个int值的数组

  该语句表明 pz 是指向包含2个 int 值的数组的指针。使用圆括号的原因是因为表达式中 [] 的优先级高于 * 。

  如果我们这样声明:  int * pax[2];//创建两个指向单个 int 值的指针

  那么首先 [] 与 pax 结合,表示 pax 是包含两个某种元素的数组。然后和 * 结合,表示 pax 是两个指针组成的数组。最后,用 int 来定义,表示 pax 是由两个指向 int 值的指针构成的数组。这种声明会创建两个指向单个 int 值的指针。 
 

2.3指针赋值事项

  把 const 指针赋给非 const 指针是错误的,因为可能会使用新指针来改变 const 数据。

  但是把 const 指针赋给 const 指针是允许的,这样赋值有一个前提:只进行一层间接运算。
例:
int * p1;
const int * p2;
const int ** p3;
 
p1 = p2;    //非法,把const指针赋给非const指针
p2 = p1;    //合法,把非const指针赋给const指针
p3 = &p1;    //非法,把非const指针赋给const指针,进行多层间接运算
 

2.4函数和多维数组

  一般的,声明N维数组的指针时,除了最左边的方括号可以留空之外,其他都需要填写数值。

  int sum (int ar[][10][20][30], int rows);

  等效原型表示:  int sum(int (*ar)[10][20][30], int rows]);

  此处 ar 指向一个 10*20*30 的 int 数组。

指针相关