指针预习

来源:互联网 发布:畜牧兽医网络教育 编辑:程序博客网 时间:2024/04/28 17:10
  • 计算机中所有的数据都必须放在内存中
  • 我们将内存中字节的编号称为地址(Address)或指针(Pointer)
  • CPU 只能通过地址来取得内存中的代码和数据
  • CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
  • 需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
  • 数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
  • 定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*,格式为:
    数据类型 * 变量名;
    数据类型 * 变量名 = 值 ;
    *表示这是一个指针变量,数据类型表示该指针变量所指向的数据的类型
  • 定义指针变量时必须带*
    给指针变量赋值时不能带*
  • 指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据,格式为:
    *pointer;
    这里的*称为指针运算符,用来取得某个地址上的数据
  • 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针
  • 指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址
  • 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组
  • 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的
  • 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”
  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。

  • 1) 指针变量可以进行加减运算,例如p++、p+i、p-=i。指针变量的加减运算并不是简单的加上或减去一个整数,而是跟指针指向的数据类型有关。

  • 2) 给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如int *p = 1000;是没有意义的,使用过程中一般会导致程序崩溃。

  • 3) 使用指针变量之前一定要初始化,否则就不能确定指针指向哪里,如果它指向的内存没有使用权限,程序就崩溃了。对于暂时没有指向的指针,建议赋值NULL。

  • 4) 两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个元素,那么相减的结果就是两个指针之间的元素个数。

  • 5) 数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和 sizeof、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组的指针。




  • 指针与空值比较用NULL;
  • 数组的指针是数组的起始地址,数组元素是数组元素的地址;
  • 函数指针变量:
    指向函数的指针变量;
    类型说明符(*指针变量名)();