指针
指针就是内存的字节单元编号地址,指针变量就是存放地址的变量。
1.野指针与空指针
野指针是指,指针变量被赋值了一个随意的数值,这个数值并不是已知变量的内存地址,这个数值指向的区域未知,导致这个指针没有实际意义,如果对这个指针指向的内存区域进行操作还会导致错误。
例如下面都是野指针:
int *p;
p=0x12345678;//给指针变量赋值了一个随意的数值
*p=20; //对未知区域赋值,报错
//输出报错,段错误
Segmentation fault (core dumped)
int a=123;
p=a; //给指针变量赋值了一个随意的数值
空指针是指指针变量没有指向任何变量,该指针变量空闲可用。用代码表示就是 该指针变量指向NULL。NULL是一个值为0的宏常量。
#define NULL ((void *)0)
//空指针
int *p=NULL;
2. 空类型指针 void *
void * 可以指向任何变量的内存空间,是一个万能指针。
//可以写成 void *p = NULL; 初始化
//案例
void *p;
int a=100;
char c='W';
p=NULL;
//p=(void *)&a;
p=&a;
printf("%d\n",*(int *)p); //输出100
//p=(void *)&c;
p=&c;
printf("%c\n",*(char *)p); //输出W
3. 指针常量
意思是这个指针变量是一个常量,指向的地址不能改变,也就是指针变量的内容不能变,指向的值可以变;
int i = 9;
//指针常量
int *const p = &i;
//改变指向的值
*p = 3;
4. 常量指针
指针的指向可以变,指向的值不能变;
int i=9;
int j=10;
int const *p = &i; //或者const int *p = &i;
printf("%d\n",*p); //输出9
//*p=20; //修改指向的值,报错
p=&j; //修改指向
printf("%d\n",*p); //输出10
5. 指向常量的指针常量
既不能修改指向,又不能修改指向的值
int i = 9;
int const *const p = &i; //或者 const int const *p = &i;
6. 指针操作数组
数组名就是数组的地址。
int a[10]={
1,2,3,4,5,6,7,8,9,0};
int len=sizeof(a)/sizeof(a[0]);
int i;
//方式一,使用i变量
for(i=0;i<len;i++)
{
printf("%d,",*(a+i));
}
printf("\n");
//方式二,使用临时指针变量
int *p=a;
for(i=0;i<len;i++)
{
printf("%d,",*p);
p++;
}
//输出
1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,
6.1 数组名作为函数参数
void printArr(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d,", a[i]);
//printf("%d,", *(a+i));
}
printf("\n");
}
int main()
{
int a[]={
1,2,3,4,5};
int len=sizeof(a)/sizeof(a[0]);
printArr(a,len);
return 0;
}
7. 多级指针
int m=10;
int *n=&m; //*n就是m
int **i=&n; //*i就是n,**i就是m
int ***j=&i; //*j就是i,**j就是n,***j就是m
printf("%d\n",*n); //10
printf("%d\n",**i); //10
printf("%d\n",***j); //10
8. 函数指针
函数名就是函数的地址,说明函数也是存在内存中的,可以利用它的地址调用函数。
函数指针可以指向同类型的函数,要求参数类型,返回值一样。
函数指针就是一个指针,指向的是一个函数。
#include <stdio.h>
int sum(int a,int b);
int des(int a,int b);
int mul(int a,int b);
int main()
{
//定义一个函数指针,指向的函数返回值是int,参数是 int,int
int(* pfun)(int a,int b)=NULL;
//赋值
//直接使用 pfun=sum; 也可以
pfun=∑
printf("%d\n",pfun(1,2)); //3
pfun=&mul;
printf("%d\n",pfun(4,2)); //8
pfun=&des;
printf("%d\n",pfun(5,3)); //2
return 0;
}
int sum(int a,int b)
{
return a+b;
}
int des(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
8.1 函数指针数组
#include <stdio.h>
int sum(int a,int b);
int des(int a,int b);
int mul(int a,int b);
int main()
{
//定义一个函数指针,指向的函数返回值是int,参数是 int,int
int(* pfun[3])(int a,int b)={
sum,des,mul};
int i;
for(i=0;i<3;i++)
{
printf("%d\n",pfun[i](10,5));
}
return 0;
}
int sum(int a,int b)
{
return a+b;
}
int des(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
//输出
15
5
50