目录

  • 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 章节知识点小结
指向多维数组的指针和指针变量


指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用方法上,多维数组的指针比一维数组的指针要复杂一些。

1. 多维数组元素的地址

a代表第0行首地址,a+1代表第1行首地址,a+2代表第2行首地址。行指针每加1,走一行。


a+i代表行号为i的行首地址(按行变化),*(a+i)代表什么?*(a+i)相当于a[i]。

a[0]代表a[0][0]的地址,a[0]+1代表a[0][1]的地址,a[0]+2代表a[0][2]的地址,a[0]+3代表a[0][3]的地址,列指针每加1,走一列。

a[i]+j代表谁的地址?     代表a[i][j]的地址

*(a[i]+j)代表什么?       代表元素a[i][j]

*(*(a+i)+j)代表什么?  与*(a[i]+j)等价,代表元素a[i][j]

2.指向数组元素的指针变量

二维数组的每一个元素a[i][j]都有一个指针(地址),它就是&a[i][j]。因此指针变量可以指向二位数组的任何一个元素 。


对二维数组元素的引用有两种方法:

① 下标法,如a[i][j]或p[k]形式。

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

例:有一个3×4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。

解题思路:

(1)二维数组的元素是整型的,它相当于整型变量,可以用int*型指针变量指向它

(2)二维数组的元素在内存中是按行顺序存放的,即存放完序号为0的行中的全部元素后,接着存放序号为1的行中的全部元素,依此类推。

(3)因此可以用一个指向整型元素的指针变量,依次指向各个元素

参考代码:

#include <stdio.h>

void main( )

{int a[3][4]= {1,2,3,4,8,7,6,5,4,1,9,6};

      int *p;

    p=&a[0][0];

      printf("output :\n");

      while (p<=&a[2][3])

  { printf("%3d", *p++);

        if ((p-&a[0][0])%4==0) 

            printf("\n");

      }

}

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

前面的例题中定义的指针变量p指向一个整型数组元素,p+1指向下一个元素。还可定义行指针,使p不指向一个数组元素,而指向一个包含m个元素的一维数组;p先指向a[0],p+1指向a[1]。

定义形式:int  (*p)[4] ;

 *表示p是指针变量, 且p所指向的对象是有4个整型元素的数组,p+1的值比p的值增加了4*4个字节(即一维数组的长度)。

观察以下程序,理解程序的功能。

#include <stdio.h>

int main()

{int a[3][4]={1,3,5,7,9,11,13,15, 17,19,21,23}; 

  int (*p)[4],i,j; 

  p=a; 

  printf(“enter row and colum:");

  scanf(“%d,%d”,&i,&j); 

  printf(“a[%d,%d]=%d\n”,   i,j,*(*(p+i)+j));

  return 0;

}

若输入1,2,结果?