目录

  • 1 第一章 C语言简介
    • 1.1 C语言前世今生
    • 1.2 主流开发环境介绍
    • 1.3 第一个小程序解析
    • 1.4 常见编译错误
    • 1.5 章节知识点小结
  • 2 算法基础
    • 2.1 算法-程序的灵魂
    • 2.2 算法的描述-流程图
  • 3 数据类型与运算符
    • 3.1 数据描述
    • 3.2 运算符和表达式1
    • 3.3 运算符和表达式2
    • 3.4 章节知识点小结
  • 4 顺序结构程序设计
    • 4.1 输入和输出
    • 4.2 顺序结构程序设计
    • 4.3 章节知识点小结
  • 5 选择结构程序设计
    • 5.1 关系运算符和关系表达式
    • 5.2 逻辑运算符和逻辑表达式
    • 5.3 if语句
    • 5.4 条件运算符
    • 5.5 switch语句
    • 5.6 章节知识点小结
  • 6 循环结构程序设计
    • 6.1 while循环结构
    • 6.2 do_while循环结构
    • 6.3 for循环结构
    • 6.4 循环的嵌套
    • 6.5 break语句和continue语句
    • 6.6 章节知识点小结
  • 7 数组
    • 7.1 一维数组
    • 7.2 二维数组
    • 7.3 字符数组
    • 7.4 章节知识点小结
  • 8 函数
    • 8.1 子程序设计
    • 8.2 函数定义
    • 8.3 函数的调用
    • 8.4 局部变量和全局变量
    • 8.5 参数传递
    • 8.6 函数递归调用
    • 8.7 章节知识点小结
  • 9 指针
    • 9.1 指针的基本概念
    • 9.2 指针变量的定义及引用
    • 9.3 通过指针引用数组元素
    • 9.4 指向多维数组的指针和指针变量
    • 9.5 用指向数组的指针作函数参数
    • 9.6 指针与字符串
    • 9.7 函数指针和指针函数
    • 9.8 章节知识点小结
  • 10 用户自己建立数据类型
    • 10.1 定义和使用结构体变量
    • 10.2 使用结构体数组
    • 10.3 结构体指针
    • 10.4 章节知识点小结
  • 11 编译预处理
    • 11.1 宏定义预处理
    • 11.2 文件包含预处理
    • 11.3 条件编译预处理
    • 11.4 章节知识点小结
  • 12 文件
    • 12.1 文件的基本知识
    • 12.2 文件的基本操作
    • 12.3 章节知识点小结
章节知识点小结


知识点

后续知识点

第九章

指针

9.1 指针与指针变量的概念

直接寻址

直接按变量名进行访问。

间接寻址

将变量i的地址存放在另一变量中,然后通过该变量来找到变量i的地址,从而访问变量i

指针的概念

指针:是具有某种数据类型的存储单元的地址。

指针变量的概念

如果有一个变量专门用来存放另一变量的地址(即指针),则它称为指针变量

9.2 变量的指针和指向变量的指针变量

 

指针变量定义

定义指针变量的形式:

    类型标示符     *指针变量名;

指针变量的基类型

指针变量的基类型用来指定此提针变量可以指向的变量的类型。

取地址运算符

& :取地址运算符;

指针运算符

* :指针运算符,取其指向的内容。

指针变量做函数的参数

实参:变量的地址

形参:指针变量

指针变量作为函数的参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来。

9.3 数组的指针和指向数组的指针变量

数组元素的指针

数组元素的指针就是数组元素的地址。

 

通过指针变量访问数组元素

如果a为数组名,p是指向数组元素的指针变量,其初值p=a,则*(a+i)*(p+i)代表a[i]

指针运算规则

如果指针变量p已指向数组中的一个元素,则p+1指向该数组中的下一个元素,p-1指向该数组中的上一个元素。

一维数组的指针作函数的参数

如果有一个实参数组,要想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下4种:

(1) 形参和实参都用数组名,如:

void  main()        void  f(int x[], int n)

{    int a[10];          {

          …                  …

     f(a,10);             }

}

(2) 实参用数组名,形参用指针变量。如:

void  main( )             void f(int *xint n)

{   int   a[10]         {

          …                …

    f(a,10);              }

 }

(3)实参形参都用指针变量。例如:

void  main()          void f(int *xint n)

{    int a[10], *p=a;      {

       …                    …

      f(p,10);            }

 }

(4) 实参为指针变量,形参为数组名。如:

 void    main()        void f(int x[ ],int n)

{   int a[10] , *p=a       {

          …                …

   f(p,10)               }

}

二维数组的列指针和行指针

列指针:每个数组元素的地址

行指针:每一行的起始地址

指向二维数组元素的指针变量

使用形式如下:

int a[3][4];

int *p=&a[0][0];

说明:该指针变量p可以指向一维数组中的元素,也可以指向二维数组中的元素,p+1则指向下一个数组元素。

数组元素的引用方法:

下标法a[i][j];

指针法,如*(p+i*3+j)

指向由m个元素组成的一维数组的指针变量

使用形式如下:

int a[3][4];

int (*p)[4]=a;

说明:该指针变量p不指向一个数组元素,而指向一个包含4个元素的一维数组,p+1不再指向下一个数组元素,而是指向下一行,p+1的值比p的值增加了4*4个字节(即一维数组的长度)

通过二维数组的行指针引用数组元素的方法:

下标法a[i][j]p[i][j];

指针法,如*(*(a+i)+j)*(*(p+i)+j)形式。

下标指针混合法,如*(a[i]+j)*(p[i]+j)(*(a+i))[j](*(p+i))[j]*(a[0]+i*n+j)(*a)[i*n+j]等形式。

二维数组指针作函数参数

二维数组指针作函数参数有两种情况:

①用指向变量的指针变量(列指针)

②用指向一维数组的指针变量(行指针)

形式如下:

// fun1用指向变量的指针变量(列指针)作参数

void  fun1(float *p,int n)

{  ……

}

 

// fun2用指向一维数组的指针变量(行指针)作参数

void  fun2(float (*p)[4],int n)

{   ……

}

 void main()

{  float score[3][4];

……

   fun1(*score,12);

   fun2(score,2);

……

}

9.4 指向字符串的指针变量

指向字符的指针变量

定义一个指向字符的指针变量,并将字符串的起始地址赋给指针变量,通过该指针变量亦可以实现字符串的操作。

指向字符的指针变量定义形式:char *str1;

指向字符的指针变量处理字符串与用字符数组处理字符串主要区别有:

(1) 在用字符数组处理字符串时,可以认为是将整个字符串的内容赋给了字符数组;但在用指向字符的指针变量处理字符串时,只是将字符串常量的指针赋给了该指针变量。

(2) 数组名是指针常量,不能重新被赋值;而指向字符串的指针变量是可以被重新赋值的。

字符串指针作函数参数

字符串指针作函数参数形式如下:

void  fun1(float (char *p)

{   ……

}

 void main()

{char  string[100];

  ……

  fun1(string);

......

}

9.5 指针数组和多重指针

指针数组概念

指针数组是指数组元素均为指针类型的数组,即指针数组中的每一个元素都是指针变量。

指针数组定义

定义一维指针数组的一般形式为:

类型名*数组名[数组长度];

例如:int  *p[4];

多重指针概念

假设有一个指向int型变量i的指针变量pp的值为&i;指针变量p本身又有指针,即&p;再定义一个指针变量b用来指向指针变量pb的值为&p。则称指针变量b是一个指向指针的指针变量。如下图所示:

 

多重指针定义

指向指针的指针变量定义形式如下:

       类型标识符  ** 变量名;

例如:int  **b

指针数组作main函数的形参

在某些情况下,main函数可以有参数,例如:

      int main(int argc,char *argv[])

其中:

l   argcargv就是main函数的形参,它们是程序的命令行参数

l   argv*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串。

l   main函数是操作系统调用的,实参只能由操作系统给出。