8:00~12:00:上课;
12:00~14:00:吃饭、休息;
14:00~17:00:写作业、学指针;
19:00~21:30:刷题;
刷题数:3;
指针归纳总结:
一维指针:
1、一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址;
2、指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中);
3、所谓数组元素的指针就是数组元素的地址;
int a[3]={0,1,2};
int *p;
p=&a[0];
注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。
在指针指向数组元素时,允许以下运算:
1、加一个整数(用+或+=),如p+1
2、减一个整数(用-或-=),如p-1
3、自加运算,如p++,++p
4、自减运算,如p--,--p
5、两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
注意:相加无意义;
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
float a[10],*p=a;
假设a[0]的地址为2000,则
p的值为2000
p+1的值为2004
P-1的值为1996
通过指针引用数组元素:
引用一个数组元素,可用下面两种方法:
1、下标法,如a[i]形式;
2、指针法,如*(a+i)或*(p+i);
其中a是数组名,p是指向数组元素的指针变量,其初值p=a;
#include"stdio.h"
int main()
{
int a[4]={1,3,5,7};
int *p=a;
printf("%d",*(p+1));
}
运行结果: 3
用数组名作函数参数:
实参数组名是指针常量,但形参数组名是按指针变量处理
在函数调用进行虚实结合后,它的值就是实参数组首元素的地址
在函数执行期间,形参数组可以再被赋值
int a[N];
max(a);
//函数首部定义应为
void max(int a[N])
//或
void max(int a[])
//或
void max(int *a)
多维数组:
通过指针引用多维数组:
请看如下代码:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"math.h"
int main()
{
int a[3][4]={{1,3,5,7},
{9,11,13,15},{17,19,21,23}};
int (*p)[4]=a;//p++移动4*sizeof(int);
int *q=a[0];//q++移动1*sizeof(int);
printf("%d\n",*(*(p+1)+0));//相当于a[1][0]
printf("%d",*(q+1));//相当于a[0][1]
}
运行结果:
9
3
为什么会出现这种情况呢? 因为p++移动4*sizeof(int)相当于a[1][0];而q++移动1*sizeof(int)相当于a[0][1];如下图所示
a代表第0行首地址;
a+1代表第1行首地址;
a+2代表第2行首地址;
a[0]代表a[0][0]的地址;
a[0]+1代表a[0][1]的地址;
a[0]+2代表a[0][2]的地址;
a[0]+3代表a[0][3]的地址;
用指向数组的指针作函数参数
一维数组名可以作为函数参数,多维数组名也可作函数参数。
用指针变量作形参,以接受实参数组名传递来的地址。
int a[M][n];
max(a);
//函数首部应该为:
void max(int arr[N][N])
//或
void max(int arr[][N])//系统不检查形参一维的大小;
//或
void max(int (*arr)[N])
可以有两种方法:
1、用指向变量的指针变量;
2、用指向一维数组的指针变量;