数组和指针的概念是C语言中最为重要的概念,也是能够灵活运用C语言的关键,重读了一下关于数组和指针的那一章,较之于之前学习的内容,感觉有了很大的补充,仅以此篇博客记录。本篇博文仅仅记录个人之前不熟悉的概念或技巧,基本概念本文不会重复。

数组

基本来说,数组是在编程过程中最基本的一种的数据结构,具有随机访问的特点。

对于C语言来说,定义一个数组需要两个信息:

  1. 数组元素的类型
  2. 数组元素的个数。

这二者缺一不可,且必须是在定义时就确定,也就是说数组的大小必须用一个常量 来定义,不能使用变量.

初始化

在初始化一个数组的时候,有一个小trick,如果初始化时赋予数组的值小于数组的长度,那么剩下的数组元素就会自动赋值为0.

举例:

:::c
int ar[4] = {1,2};

上述代码中,ar的前两个元素是1和2,而后两个元素就会自动赋值为0,但是,如果不初始化数组,仅仅是申明的话,数组中的元素值是不确定的,不会自动初始化为0.

另外,初始化时也可以不指定数组大小,由用初始化的数值的个数来确定.

举例:

:::c
int ar[] = {1,2};

指针

指针是一个非常重要的概念,它能提供了一种直接操作内存地址的方式,如果能正确并灵活地运用指针,可以大大提高程序的运行效率。

指针说穿了就是一类特殊的变量,该变量存储的值是内存地址,而不是普通的数值。

关于指针,有两个完全的相反的操作:取地址&和取值*.

  • 取地址&: 可以用与任意的变量上,&运算符给出变量的地址。
  • 取值*: 只能用于指针变量,*运算符用来取出存储在被指向地址中的数值。

在定义一个指针变量的时候,最重要的是要确定其类型,因为只有确定了指针的类型,才能正确的计算所需要的内存地址。

指针操作

在C语言中,指针变量一共可以进行六种操作:

  1. 赋值
  2. 取值
  3. 加法
  4. 减法
  5. 取地址
  6. 比较

由于指针变量存储的实际内容是内存的地址,因此对地址进行乘法或除法运算是没有任何意义的。

当对指针变量进行加法或减法的时候,增加或减少的是一个存储单元,而不是一个字节,存储单元的大小由指针的类型来确定,这也就是为什么定义指针的时候,必须明确指定其类型。简单来说,对指针加1等于对指针的值加上它指向的对象类型的字节大小

在使用指针的时候,有一点必须要注意:不能对未初始化的指针取值.

:::c
int *pt; //未初始化的指针*
*pt = 5; //一个可怕的错误*

由于pt并没有被初始化,因此其存储的内存地址完全是随机的,我们无法知道5到底被存储到哪里去了。这个位置如果覆盖了程序的其他数据,会引起灾难性的后果。需要切记:当创建一个指针的时候,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。

指针与数组

指针和数组的关系是非常密切的,一个最直观的关系就是:数组名就是数组首元素的地址,即如果arg是一个数组的话,那么等式arg=&arg[0]永远成立.

但是,指针和数组还是有区别的,最重要的是:

  • 数组是一个常量,无法改变,无法自增自减。
  • 指针是一个变量,可以被改变,可以自增自减。

Share on: TwitterFacebookEmail


Flyaway is the owner of this blog.

Published

Category

programming-language

Tags

Contact