数组和指针的概念是C语言中最为重要的概念,也是能够灵活运用C语言的关键,重读了一下
数组
基本来说,数组是在编程过程中最基本的一种的数据结构,具有随机访问的特点。
对于C语言来说,定义一个数组需要两个信息:
- 数组元素的类型
- 数组元素的个数。
这二者缺一不可,且必须是在定义时就确定,也就是说数组的大小必须用一个常量 来定义,不能使用变量.
初始化
在初始化一个数组的时候,有一个小trick,如果初始化时赋予数组的值小于数组的长度,那么剩下的数组元素就会自动赋值为0.
举例:
:::c
int ar[4] = {1,2};
上述代码中,ar
的前两个元素是1和2,而后两个元素就会自动赋值为0,但是,如果不初始化数组,仅仅是申明的话,数组中的元素值是不确定的,不会自动初始化为0.
另外,初始化时也可以不指定数组大小,由用初始化的数值的个数来确定.
举例:
:::c
int ar[] = {1,2};
指针
指针是一个非常重要的概念,它能提供了一种直接操作内存地址的方式,如果能正确并灵活地运用指针,可以大大提高程序的运行效率。
指针说穿了就是一类特殊的变量,该变量存储的值是内存地址,而不是普通的数值。
关于指针,有两个完全的相反的操作:取地址&
和取值*
.
- 取地址
&
: 可以用与任意的变量上,&
运算符给出变量的地址。 - 取值
*
: 只能用于指针变量,*
运算符用来取出存储在被指向地址中的数值。
在定义一个指针变量的时候,最重要的是要确定其类型,因为只有确定了指针的类型,才能正确的计算所需要的内存地址。
指针操作
在C语言中,指针变量一共可以进行六种操作:
- 赋值
- 取值
- 加法
- 减法
- 取地址
- 比较
由于指针变量存储的实际内容是内存的地址,因此对地址进行乘法或除法运算是没有任何意义的。
当对指针变量进行加法或减法的时候,增加或减少的是一个存储单元,而不是一个字节,存储单元的大小由指针的类型来确定,这也就是为什么定义指针的时候,必须明确指定其类型。简单来说,对指针加1等于对指针的值加上它指向的对象类型的字节大小
在使用指针的时候,有一点必须要注意:不能对未初始化的指针取值.
:::c
int *pt; //未初始化的指针*
*pt = 5; //一个可怕的错误*
由于pt
并没有被初始化,因此其存储的内存地址完全是随机的,我们无法知道5到底被存储到哪里去了。这个位置如果覆盖了程序的其他数据,会引起灾难性的后果。需要切记:当创建一个指针的时候,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。
指针与数组
指针和数组的关系是非常密切的,一个最直观的关系就是:数组名就是数组首元素的地址,即如果arg
是一个数组的话,那么等式arg=&arg[0]
永远成立.
但是,指针和数组还是有区别的,最重要的是:
- 数组是一个常量,无法改变,无法自增自减。
- 指针是一个变量,可以被改变,可以自增自减。