一、指针变量
1、定义格式
- 类型名 *指针变量名
- “*”不是运算符,只是一个定义指针变量的标志
2、指针变量的引用
- “&”取地址运算符,int a =20, *p; p = &a;
- “*”取内容运算符。int b=*p
二、一维数组与指针
若数组为形参,则将数组名做指针变量来处理;
- &与*互逆
- *与[]等价
- &与[]互逆
1、指向数组元素的指针
- 指向数组元素的指针与指向普通元素的用法一样
2、指向一维数组的指针
数组名代表数组首地址,是不能被改变的常量
当指针变量指向数组中某一元素是,指针变量+1指向数组下一个元素。p±n表示前后移动n个元素,如:
float a[10]; float *p;p = &a[4];
则p-3指向a[1].
三、多维数组与指针
int a[3][4];
- a+1是跳一行
- a+i 是行指针,指向一整行
- *(a+i) 和 a[i] 一样,都是一个列指针,指向一个元素
- *(a+i)+j 和 a[i]+j 一样,都表示a[i][j]的地址,即&a[i][j]
- ((a+i)+j)、(a[i]+j )、((a+i)[j])和a[i][j]一样,都表示元素
一位数组名表示的是列指针
- 二维数组名表示的是行指针
- 只有列指针才是“真正”指向元素
1、指向二维数组元素的指针变量
int a[3][4];
// 这里p是一个列指针,所以画数组a要按列画。
// 行指针的定义在下面,行指针出现则把二维数组画成二维表
int *p = &a[0][3];
则:
p+1指向a[1][0]
p+4指向a[1][3]
注:p±n表示前后移动n个元素!
2、指向有m个元素组成的一维数组的指针变量
定义:类型名 (*指针变量名)[m]
int a[4][m];
int (*p)[m];
四、字符串与指针
c语言中字符串就是首地址
char *p ="china";
这里p存的就是c的地址;
p="Chinese";
这里也是合法的,p存的就是大C的地址;
五、函数与指针
函数名是函数所占空间的起始地址。
不需要加形参
- 定义指向函数的指针变量的方式:
类型名 (*指针变量名)();
int min(int a,int b)
{ return a > b ? b : a }
int max(int a,int b)
{ return a > b ? a : b }
main()
{ int x = 6,y= 10;
int (*p)();
p=max;
printf("%d",p(x,y)) // 10
p=min;
printf("%d",p(x,y)) // 6
}
六、返回指针的函数
类型名 *函数名(形参列表)
{
}
int *fun(int *x, int *y)
{
if(*x<*y)
return x;
else
return y;
}
七、指针数组
类型名 *数组名【常量表达式】
int *s[10] //这是一个指针数组常量,只能在赋值号右边
int (*p)[10] //这是一个变量
指向指针的地址变量
类型名 **指针变量名;
int a = 3;
int *p = &a; //指向内容的指针
int **k = &p;//指向指针的指针,二级指针
八、空指针
int *p=NULL;