打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
指针
指针变量也是一个变量
指针存放的内容是一个地址,该地址指向一块内存空间
1.2 指针变量的定义
可以定义一个指向一个变量的指针变量。
int *p;//表示定义一个指针变量。
*p;//代表指针所指内存的实际数据
切记,指针变量只能存放地址,不能将一个int型变量直接赋值给一个指针。
int *p = 100;
1.3 &取地址运算符
&可以取得一个变量在内存当中的地址
1.4 无类型指针
定义一个指针变量,但不指定它指向具体哪种数据类型。可以通过强制转化将void *转化为其他类型指针,也可以用(void *)将其他类型指针强制转化为void类型指针。
void *p
1.5 NULL
NULL在C语言中的定义为(void *)0
1.6 空指针与野指针
指向NULL的指针叫空指针,没有具体指向任何变量地址的指针叫野指针
1.7 指针的兼容性
指针之间赋值比普通数据类型赋值检查更为严格,例如:不可以把一个double *赋值给int *
原则上一定是相同类型的指针指向相同类型的变量地址,不能用一种类型的指针指向另一种类型的变量地址。
1.8 指向常量的指针与指针常量
const char *p;//定义一个指向常量的指针
char *const p;//定义一个指针常量,一旦初始化之后其内容不可改变
1.9 指针与数组的关系
一个变量有地址,一个数组包含若干个元素,每个元素在内存中都有地址。
int a[10];
int *p = a;
比较p和&a[0]的地址是否相同
1.10 指针运算
指针运算不是简单的整数加减法,而是指针指向的数据类型在内存中占用字节数做为倍数的运算。
char *p;
p++;移动了sizeof(char)这么多的字节数
int *p1;
p1++;移动了sizeof(int)这么多的字节数
赋值:int *p = &a;
求值:int I = *p;
取指针地址 int **pp = &p;
将一个整数加(减)给指针:p + 3; p – 3;
增加(减少)指针值 p++,p--
求差值 ,p1 – p2,通常用于同一个数组内求两个元素之间的距离
比较 p1 == p2,通常用来比较两个指针是否指向同一个位置。
1.11 通过指针使用数组元素
p+1 代表&a[1],也可以直接使用p[1]表示a[5]
p+5 代表&a[5]
p++
1.12 指针数组
int *p[5];
1.13 指向指针的指针(二级指针)
指针就是一个变量,既然是变量就也存在内存地址,所以可以定义一个指向指针的指针。
int i = 10;
int *p1 = &i;
int **p2 = &p1;
printf('%d\n', **p2);
以此类推可以定义3级甚至多级指针。C语言允许定义多级指针,但是指针级数过多会增加代码的复杂性,考试的时候可能会考多级指针,但实际编程的时候最多用到3级,但3级指针也不常用,一级和二级指针是大量使用。
1.14 指向二维数组的指针
int buf[3][5]
二维数组名称,buf代表数组首地址
int (*a)[5]
定义一个指向int [5]类型的指针变量a
a[0], *(a + 0), *a
0行,0列元素地址
a + 1
第1行首地址
a[1], *(a + 1)
第1行,0列元素地址
a[1] + 2, *(a + 1) + 2, &a[1][2]
第1行,2列元素地址
*(a[1] + 2), *(*(a + 1) + 2), a[1][2]
第1行,2列元素的值
1.15 指针变量做为函数的参数
函数的参数可以是指针类型。,它的作用是将一个变量的地址传送给另一个函数。
通过函数的指针参数可以间接的实现形参修改实参的值
1.16 一维数组名作为函数参数
当数组名作为函数参数时,C语言将数组名解释为指针
int func(int array[10]);
1.17 二维数组名作为函数参数
二维数组做函数参数时可以不指定第一个下标。
int func(int array[][10]);
将二维数组做为函数的参数用例不是特别多见
1.18 const关键字保护数组内容
如果讲一个数组做为函数的形参传递,那么数组内容可以在被调用函数内部修改,有时候不希望这样的事情发生,所以要对形参采用const参数
func(const int array[])
1.19 指针做为函数的返回值
1.20 指向函数的指针
指针可以指向变量,数组,也可以指向一个函数。
一个函数在编译的时候会分配一个入口地址,这个入口地址就是函数的指针,函数名称就代表函数的入口地址。
函数指针的定义方式:int (*p)(int);//定义了一个指向int func(int n)类型函数地址的指针。
1、定义函数指针变量的形式为:函数返回类型(*指针变量名称)(参数列表)
2、函数可以通过函数指针调用
3、int( * P)()代表指向一个函数,但不是固定哪一个函数。
void man()
{
printf('抽烟\n');
printf('喝酒\n');
printf('打牌\n');
}
void woman()
{
printf('化妆\n');
printf('逛街\n');
printf('网购\n');
}
int main()
{
void(*p)();
int i = 0;
scanf('%d', &i);
if (i == 0)
p = man;
else
p = woman;
p();
return 0;
}
在回调函数和运行期动态绑定的时候大量的用到了指向函数的指针。
1.21 把指向函数的指针做为函数的参数
将函数指针做为另一个函数的参数称为回调函数
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int add(int a, int b)
{
return a + b;
}
void func(int(*p)(int, int), int a, int b)
{
int res = p(a, b);
printf('%d\n', res);
}
int main()
{
int  i = 0;
scanf('%d', &i);
if (i == 0)
func(max, 10, 20);
else
func(add, 10, 20);
return 0;
}
1.22 memset,memcpy,memmove函数
这三个函数分别实现内存设置,内存拷贝和内存移动
使用memcpy的时候,一定要确保内存没有重叠区域。
#include
1.23 指针小结
定义
说明
int  i
定义整形变量
int *p
定义一个指向int的指针变量
int a[10]
定义一个int数组
int *p[10]
定义一个指针数组,其中每个数组元素指向一个int型变量的地址
int (*p)[10]
定义一个数组指针,指向int [10]类型的指针变量
int func()
定义一个函数,返回值为int型
int *func()
定义一个函数,返回值为int *型
int (*p)()
定义一个指向函数的指针,函数的原型为无参数,返回值为int
int **p
定义一个指向int的指针的指针,二级指针
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
为什么很多人编程喜欢用typedef?如何避免滥用?
C语言|用函数指针调用函数可以增加被调函数的通用性和灵活性
为什么很多人编程喜欢用typedef?
C语言结构体(struct)常见使用方法
C语言的那些秘密之---函数返回局部变量
简单总结C语言中各种类型的指针的概念
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服