1、C程序设计中使用指针的好处:

  • 使程序简洁、紧凑、高效;
  • 有效地表示复杂的数据结构;
  • 动态分配内存;
  • 得到多于一个的函数返回值。

2、内存中每个字节都有自己唯一的编号————内存地址;

  • 在程序中声明一个变量,如int
    i;在程序被编译或者函数被调用时,为这个变量分配相应的内存单元,即分配多少个字节的长度的内存单元。变量就是对程序中数据存储空间的抽象。
  • 换句话说———内存相当于高楼大厦,每个房间(相当于内存单元)都有自己唯一的门牌号(即内存地址)。现在根据需要将1-4号房间,分配给大山使用,则这1-4号房间就叫做大山的房间,相当于int i;中的i ,而为i分配的内存单元由操作系统决定大小,木有操作系统,就由处理器决定。

3、存储单元、内存地址及指针

  • 指针就是储存单元的地址。
  • 一个变量的指针就是该变量在内存中的存储单元的地址。
  • 存取变量中的数据有两种引用方式:
直接引用:按变量名称存取变量的值。

  间接引用:将其变量的指针即该变量的内存地址,放在另一个新的变量中,则现在这个新的变量中存储的值就是原来变量的内存地址值,现在对新变量进行操作,就相当于根据原变量内存地址,对原变量进行存取操作!

4、指针变量

  • 指针:一个内存的地址。直接就是内存地址
  • 指针变量:专门存放地址的变量。将变量的内存地址存入指针变量,则该指针变量的地址即指针就直接指向原变量的值。

4.1 变量的指针和指向变量的指针变量

  • 变量的指针:就是变量的内存地址
  • 指向变量的指针变量:就是存放变量内存地址的变量。
    其中,用*表示指针变量所指向的对象。
    如:指针变量pa指向变量a。则*pa就表示pa的对象,即变量a。(此时*pa与a为同一个变量)
  • 指针:就是变量的地址。
  • 指针变量:是可以存放指针的变量。
  • 指针类型:由变量的类型决定。
    例:指针变量pa指向变量a,即表示变量pa中存放着变量a的内存地址。
    若 pa = &a; 则此时 *pa 与 a 是等价的。

4.2 指针变量的定义与初始化

4.2.1. 指针变量的定义
一般形式:数据类型 *指针名;

例:

int *p1,*p2;
     float   *q ;
     static  char  *name;
/*
注意:
1、int *p1,p2与 int *p1,p2不同,每个指针变量前都有一个*;
2、指针变量名是p1,p2,不是*p1,*p2;
3、指针变量只能指向定义时所规定类型的变量;int *p,a; char c; float x;  p只能指向a,不能指向c或x。
*/

4.2.2 指针变量的初始化
一般形式: 数据类型 *指针名=初始地址值;

int i;
int *p = &i;//注意:变量i必须在定义该指针*p变量前,已经定义,并且指针变量类型与变量i的类型一致
int i;
int *p=&i;
int *q=p;//可以用已经初始化过的指针变量作初值。
int i;
static int *p=&i;//这是错误的,不能用auto变量的地址去初始化static型指针

4.2.3 指针变量的引用

  • i_pointer—–指针变量,它的内容是地址量
  • *i_pointer—-指针的目标变量,它的内容是数据
  • &i_pointer—指针变量占用内存的地址

5、指针与函数
5.1 指针作为函数的参数 ——-地址传递
好处:共享内存,“双向”传递

传地址的特点:

  • 实参可以是变量、常量或表达式,其实参值是指针数据类型。
  • 在被调用函数中,可以通过地址间接访问主调函数中的变量,而达到改变主调函数的变量值。

6、指针与一维数组

[] 变址运算符
a[i]  *(a+i)
即 a[0] <=> *a
·········
a[5] <=> *(a+5)

7、关于数组名作为函数参数
数组名作为函数的参数,实质上是指针作为函数的参数

数组名作为函数参数,实参与形参的对应关系
实参是数组名或指针变量,对应的形参可以是数组名或指针变量