这个礼拜学习的是指针的东西,指针其实还是蛮难的,现在掌握的不是很好。
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
设有字符变量c,其内容为 'K'(ASCII码为十进制数 75),c占用了0X11A号内存单元(地址通常用十六进数表示)。设有指针变量p,内容为 0X11A,这种情况我们称为p指向变量c,或说p是指向变量c的指针。
变量:变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。为了表示指针变量和它所指向的变量之间的关系,在程序中用*符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。因此,下面两个语句作用相同:
i=3;
*i_pointer=3;
第2个语句的含义是将3赋给指针变量i_pointer所指向的变量。
定义指针变量的一般形式为:
类型说明符 *变量名;
其中,*表示这是一个指针变量,变量名是一个合法的标识符,类型说明符表示该指针变量所指向的变量的数据类型。例如:
int *p1;
表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。再如:
int *p2; //p2是指向整型变量的指针变量
float *p3; //p3是指向浮点变量的指针变量
char *p4; //p4是指向字符变量的指针变量
应该注意的是,一个指针变量只能指向同类型的变量,如 p3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。
然后是二维数组,现在定义一个二维数组 int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于0,a+1代表第一行的首地址,等于4,a[0]是第一个一维数组的数组名和首地址,因此也为0。*(a+0)或*a是与 a[0] 等效的, 它表示一维数组a[0]中第 0 个元素的首地址,也为0。&a[0][0]是二维数组a的0行0列元素首地址,同样是0,因此,a、a[0]、*(a+0)、*a、&a[0][0]是相等的。
同理,a+1是二维数组1行的首地址,等于,4,a[1]是第二个一维数组的数组名和首地址,因此也为,4。&a[1][0]是二维数组a的1行0列元素地址,也是4,因此a+1、a[1]、*(a+1)、&a[1][0]是等同的。另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的第1个元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由于*(a+i)+j是二维数组a的i行j列元素的首地址,所以,该元素的值等于*(*(a+i)+j)。
指针的定 义 含 义
int i; 定义整型变量 i。
int *p; p为指向整型数据的指针变量。
int a[n]; 定义整型数组a,它有n个元素。
int *p[n]; 定义指针数组p,它由n个指向整型数据的指针元素组成。
int (*p)[n]; p为指向含n个元素的一维数组的指针变量。
int f(); f 为一个返回整型的函数。
int *p(); p为一个返回指针的函数,该指针指向整型数据。
int (*p)(); p为指向函数的指针,该函数返回一个整型值。
int **p; p是一个指针变量,它又指向另外一个指针变量,该指针变量指向整型数据。
指针变量赋值:将一个变量的地址赋给一个指针变量。
p=&a; //将变量a的地址赋给p
p=array; //将数组array的首地址赋给p
p=&array[i]; //将数组array第i个元素的地址赋给p
p=max; //max为已定义的函数,将max的入口地址赋给p
p1=p2; //p1和p2都是指针变量,将p2的值赋给p1
注意,不能将一个数值直接赋给指针变量,例如p=1000;是没有意义的,一般会引起程序崩溃。
定 义 | 含 义 |
---|---|
int i; | 定义整型变量 i。 |
int *p; | p为指向整型数据的指针变量。 |
int a[n]; | 定义整型数组a,它有n个元素。 |
int *p[n]; | 定义指针数组p,它由n个指向整型数据的指针元素组成。 |
int (*p)[n]; | p为指向含n个元素的一维数组的指针变量。 |
int f(); | f 为一个返回整型的函数。 |
int *p(); | p为一个返回指针的函数,该指针指向整型数据。 |
int (*p)(); | p为指向函数的指针,该函数返回一个整型值。 |
int **p; | p是一个指针变量,它又指向另外一个指针变量,该指针变量指向整型数据。 |