Linux C语言学习 --- 指针与数组

  • 指针与一维数组
  1. 数组的指针

数组是有一定顺序关系的若干变量的集合,占用连续的存储空间,集合中的每个元素就称之为数组的元素。

   数组元素的地址是指数组元素在内存中的起始地址。可以由各个元素加上取地址符“&”构成。比如:&a[0]就表示数组中第一个元素的地址,&a[1]就表示第二个元素的地址,以此类推。

   特别要强调的是,数组名代表了数组的起始地址。所以,以下两个表达式的值是相等的:

int a[10]; 

a == &a[0]

   这里引出一个概念:数组指针。数组指针是指向数组起始地址的指针,其本质为指针。一维数组的数组名为一维数组的指针。

  1. 数组元素的表示

设指针变量px的地址值等于数组指针x(即指针变量px指向数组的首元数),则以下具有完全相同的功能(如图):


x[i] 、*(px+i)、*(x+i) 和px[i]

   下面,通过一个程序来加深理解:

程序执行结果如下:

得出结论:一维数组a的第i个元素,有下标法和指针法。假设指针变量p指向数组的首元素,则有四种数组元素的表达方式:

x[i] <==> *(px+i) <==> *(x+i) <==> px[i]

指针和数组的常见等价操作:

指针操作

数组操作

说明

array

&array[0]

数组首地址

*array

array[0]

数组的首元素

array + i

&array[i]

数组的第i个元素地址

*(array + i)

array[i]

数组的第i个元素

*array + b

array + b

数组首元素的值加b

*(array + i) + b

array[i] + b

数组第i个元素的值加b

*array++

array[i++]

先取得第i个数组的值,i再加1

*++array

array[++i]

先将i加1,再取得第i个数组的值

*array- -

array[i- -]

先取得第i个数组的值,i再减1

* - -array

array[- -i]

先将i减1,再取得第i个数组的值

  • 指针与多维数组
  1. 列指针遍历二维数组

多维数组就是具有两个或两个以上下标的数组,实际上,在C语言中并没有多维数组的概念,所谓多维数组就是低维数组的组合。依然可以理解为若干个相同类型的变量的集合,这里只介绍二维数组。

在C语言中,二维数组的元素连续存储,按行优先存,存储完第一行继续存第二行,以此类推。基于这个特点,可以用一级指针来遍历二维数组。

示例程序如下:


程序运行结果如下:

从程序的输出结果,可以看到二维数组中各个元素的地址,由于一级指针p,p+i移动i个数,相当于移动了i列,因此也称指针p为列指针,该程序就是通过列指针对二维数组进行了遍历。

  1. 行指针遍历二维数组

行指针(数组指针)

存储行地址的指针变量,叫做行指针变量。形式如下:

    1. <存储类型>   <数据类型>   (*<指针变量名>)[表达式] ;
    2. 例如,int a[2][3];  int (*p)[3];

方括号中的常量表达式表示指针加1,移动几个数据。

当用行指针操作二维数组时,表达式一般写成1行的元素个数,即列数。有以下结论:

a[i][j] <==> *(*(p+i)+j)  <==> *(a[i]+j) <==>*(p[i]+j)

示例程序:

程序运行结果:

在该程序中,二维数组名和行指针在表达形式上非常类似。本质区别是数名是常量,指针是变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱永不消散

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值