C语言之指针与数组

C语言之指针与数组

前言
访问数组元素既可以使用数组名加下标的方法,也可以使用指针的方法。但使用指针的方法可以使代码更紧凑、更灵活、更高效。

一、几个概念
数组的指针:数组所占内存区域的起始地址。而数组名代表数组的起始地址,即数组的指针。

数组元素的指针:数组元素所占内存区域的起始地址。

说明:

  • 符号“<==>”是"代表了"的意思;
  • 其实所有的点,都是为了解释黄色字体部分,弄懂了黄色字体部分,也就搞懂了如何利用指针访问数组。

二、指针访问一维数组

1、利用指针名构造指针表达式
例如:定义整型数组a,int a[6];

  • *a<==>a[0];
  • *(a+i)<==>a[i],即利用 *(a+i)可以访问数组元素a[i];

2、利用指针变量访问数组

  • int a[5],*p;定义整型数组a,和整型指针p
  • p=&a[0],获得数组元素a[0]的指针
  • *p<==>a[0]
  • *(p+i)<==>a[i],即利用 *(p+i)可以访问数组元素a[i];

三、指针访问二维数组

  • 行指针:二维数组中一行数组元素所占用的内存区域的起始地址

  • 列指针:二维数组中一个数组元素所占用的内存区域的起始地址

  • 二维数组a[2][3]在计算机中的连续存储地址如下:
    C语言之指针与数组

  • 将二维数组a[2][3]看做一维数组a[2],一维数组中a[0]又是一个一维数组a[0][1]

  • 如此理解可得:二维数组名a<==>a[0]的地址,即二维数组a[2][3]的第0行的地址。

  • a、a+1便是二维数组a中的两个行指针

  • a[i]<==>数组首元素a[i][0]的地址,因此a[i]是一个列指针

  • a[i]+j<==>a[i][j]的地址,即二维数组的列指针;

由以上可知:

  • *(a+i)<==>a[i]
  • *(a+i)+j<==>a[i]+j
  • ((a+i)+j)<==>a[i][j]
  • a[i]是一个列地址,指向数组元素a[i][0],而&a[i]<==>a+i是一个行地址,指向二维数组第i行
  • 因此可以通过*(*(a+i)+j)访问a[i][j];

行指针变量: 用以指向有n个元素组成的一维数组指针变量

  • 定义如:int (*p)[4],定义行指针变量p。外括号不能去掉,否则变成了定义指针数组

四、指针与字符串
1、例如:char *s=“C Language”;,表示s是一个指向字符串的指针变量,把字符串的首地址赋予指针s;
2、字符串指针变量和字符数组的区别:
例如:char *s; s=“C Language” 可行;
char st[20];st={“C Language”};不可行;

五、指针数组
1、定义例如:==int *p[10];(注意与行指针变量的区别)==定义指针数组p的每个元素都是能指向int类型数据的指针变量。