目录

  • 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 章节知识点小结
通过指针引用数组元素



一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址, 数组元素的指针就是数组元素的地址。

可以用一个指针变量指向一个数组元素,如下图所示。

在指针指向数组元素时,允许以下运算:

加一个整数(用+或+=),如p+1

减一个整数(用-或-=),如p-1

自加运算,如p++,++p

自减运算,如p--,--p

两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)

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

float a[10],*p=a;

假设a[0]的地址为2000,则

p的值为2000

p+1的值为2004(即&a[1])

(2) 如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素

(3)  *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。



引用一个数组元素,可用下面两种方法: 

(1) 下标法,如a[i]形式

(2) 指针法,如*(a+i)或*(p+i)

其中a是数组名,p是指向数组元素的指针变量,其初值p=a


例:有一个整型数组a,有10个元素,要求输出数组中的全部元素。

解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3) 用指针变量指向数组元素

(1) 下标法。 

#include <stdio.h>

int main()

{ int a[10];  int i;

   printf(“enter 10 integer numbers:\n");

   for(i=0;i<10;i++) scanf("%d",&a[i]);

   for(i=0;i<10;i++)  printf(“%d ”,a[i]); 

   printf("%\n");

   return 0;

 }

(2) 通过数组名计算数组元素地址,找出元素的值

#include <stdio.h>

int main()

{ int a[10];  int i;

   printf(“enter 10 integer numbers:\n");

   for(i=0;i<10;i++)  scanf("%d",&a[i]);

   for(i=0;i<10;i++)

          printf(“%d ”,*(a+i)); 

   printf("\n");

   return 0;

 }

(3) 用指针变量指向数组元素 

#include <stdio.h>

int main()

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

   printf(“enter 10 integer numbers:\n");

   for(i=0;i<10;i++)  scanf("%d",&a[i]);

   for(p=a;p<(a+10);p++)

        printf(“%d ”,*p); 

   printf("\n");

   return 0;

}

3种方法的比较:

① 第(1)和第(2)种方法执行效率相同。C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。因此用第(1)和第(2)种方法找数组元素费时较多。

② 第(3)种方法比第(1)、第(2)种方法快。用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律地改变地址值(p++)能大大提高执行效率。

③ 用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。