前言
楼主大一的时候学过一点C语言,但是之后一直没有用,最近用到了发现有很多不会的地方,所以开一篇博客记录学习的过程。
一、数组与指针的关系
C语言支持数组的数据结构,它是存储固定大小的相同类型元素的集合。
声明数组,需要指定元素的类型和数量。如下所示:
//type arrayName [arraySize],声明一个int类型、包含10个元素的数组
int p[10];
现在p是一个可用数组,里面可以容纳10个int类型的数据。p[0]表示其中的第一个元素
而数组名,也就是这里的p,是一个指向数组里第一个元素的指针。也就是 p 的值是数组p中的第一个元素的地址。
二、C中的指针
每一个变量都有一个内存位置,用&运算符可以访问地址。
什么是指针呢?指针是一个用来存放内存地址的变量(也有常量指针)。它就像其他变量或者常量一样,只不过它存储的是地址值,如下所示。
int a = 10;
int *p = &a;
指针的值是地址,但是它也可以表示地址所指向的值。比如这里 p的值为a的地址,*p可以表示这个地址指向的值,即10。
int a = 10;
int *p = &a;
printf("a的地址为%p\n",p);
printf("a的值为%d\n",*p);
如何定义指针呢?
指针变量声明的一般形式为
//type *var_name
int *ip; //一个整型的指针,也就是ip指向的是整型量
doubel *dp; //一个double 型的指针
float *fp; //一个浮点型的指针
注意,这里的type是指针指向的量的类型,例如ip为一个整型数据的地址,但是指针本身的值的类型都是一样的,都是一个代表地址的长的十六进制数。
三.如何用指针表示数组:
如第一部分所说,数组名其实是指向数组中第一个元素的指针,也就是可以把数组名作为一个常量指针(两者并不完全等价)。
关于什么是常量指针以及指针常量:
常量指针:落脚点是指针,这是一个指针,只不过是常量的指针即:指向的是一个常量。(指针本身可以是变量)。如下例所示。
const int *p = &a;
这里p是一个指针变量(可以再次被赋值),指向常量a。
指针常量:落脚点是常量,说明这是一个指针类型的常量。如下例所示:
int *const p = &a;//定义一个指针常量
这里p是一个常量,它的值是a的地址,p它不可以被再次赋值。
如何用指针表示数组呢?
例如这里声明一个数组 bear ,下面的bear是一个指向bear[0]的指针,也就是bear相当于一个常量指针,存的是bear[0]的地址。
int bear[2];
知道bear相当于一个指针类型的量,所以这里可以将bear赋值给指针。现在可以用var_bear来访问数组了。例如*(var_bear)指向的是bear[0],*(var_bear+1)指向的是bear[1];
提一下,var_bear+1,实际上它的值是加了4,这是因为int类型占4个字节。
总结
指针变量存的是地址值,数组名可以看作常量指针。