今天小编带各位一起走进神奇的指针世界。
目录
一.指针是什么
二.指针类型的意义
1.+1/-1的操作,跳过几个字节(步长)
2.解引用操作时的权限(访问几个字节)
三.指针运算
1.加减整数运算
2.指针减指针
四.指针数组
五.数组名是什么
1.数组名在大部分情况下表示:
2.但是有两个例外
a)sizeof(数组名)-----这时候的数组名代表整个数组
b)&数组名------取出的是整个数组的地址
六.数组指针
1.如何定义呢?
2.如何理解呢?
3.如何运用呢?
七.函数指针
七.函数指针数组
1.如何定义与应用见图:
2.显示生活中的应用(简单的计算器)
一.指针是什么
用关系链接图可简单认识指针
内存-->内存的单元(1byte)-->编号-->地址-->指针
在关系链接图中可以清楚的看到指针是内存单元的编号
所以指针就是一个地址而已
口头语所说的指针一般指:指针变量
而指针变量就是一个变量而已,就是一块内存空间,指针变量用来存放地址
指针变量大小是?----4/8(byte)
指针可以方便找到想要利用的内存地址进行解引用
见代码:
#includeint main() { int a = 20; int* p = &a;//初始化指针变量 *p = 30;//解引用 printf("%d", a); return 0; }
二.指针类型的意义
指针的类型有许多种一般有整数指针和字符指针
int a = 20; int* p = &a;//整型指针 char b = 'w'; int* pa = &b;//字符指针
意义:
1.+1/-1的操作,跳过几个字节(步长)
大家有没有想过同样是指针为什么一个指针加1就能放问道下标为2的内存空间,一个却要加4
解释如图:
2.解引用操作时的权限(访问几个字节)
三.指针运算
1.加减整数运算
1.加减整数运算
相当于指针的运动跳过几个字节
2.指针减指针
相当于计算指针间有几个元素
具体流程如图:
在图中我们可以看出两指针之间有两个元素
四.指针数组
指针数组:本质上就是数组,数组中存放的是指针(地址)
#includeint main() { int a = 10; int b = 20; int c = 30; int* pa = &a; int* pb = &b; int* pc = &c; int* arr[3] = { pa,pb,pc };//指针数组 printf("%d", *(*(arr)) );//指针数组的运算 return 0; }
解释如图:
这里的运算可以是*(*(arr)) 也可以是*(arr[0])
五.数组名是什么
1.数组名在大部分情况下表示:
数组首元素地址;
2.但是有两个例外
a)sizeof(数组名)-----这时候的数组名代表整个数组
#include
int main()
{
int a[10] = { 1,2,3 };
int c = sizeof(a);
printf("%d", c);
//c的结果为40
return 0;
}
#includeint main() { int a[10] = { 1,2,3 }; int c = sizeof(a); printf("%d", c); //c的结果为40 return 0; }
原因:因为一个整数占4个字节则十个整数占40 个字节
b)&数组名------取出的是整个数组的地址
具体解释如图:
六.数组指针
指向数组的指针就是数组指针
1.如何定义呢?
int main()
{
int arr[10]={0};
int(*p)[10]=&arr;
return 0;
}
2.如何理解呢?
1.(*)说明p为指针变量
2.int(*)[10]为指针变量所指向的类型
3.如何运用呢?
#include
void print2(int(*p)[5], int r, int c)
{
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for (j = 0; j < c; j++)
{
printf("%d ", *(*(p + i) + j));
//p[i][j]
}
printf("n");
}
}
int main()
{
int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
print2(arr, 3, 5);
//arr表示第一行的地址
return 0;
}
结果:
七.函数指针
定义:指向函数的指针
那么如何定义与应用呢?
#includeint Add(int x, int y) { return x + y; } int main() { //printf("%pn", &Add); int (*pf)(int, int) = Add; //函数的地址存放到函数指针变量中 //int sum = (*pf)(2, 3); int sum = pf(2, 3); //int sum = Add(2, 3); printf("%dn", sum); return 0; }
理解:int (*pf)(int, int) = Add;
1.(*)能说明变量p为指针变量
2.int(*)(int,int)说明了其指向的类型
七.函数指针数组
定义:存放函数指针的数组
1.如何定义与应用见图:
#include
int main()
{
int (*pf)(int, int) = Add;//pf是函数指针
int (*arr[4])(int, int) = { Add, Sub, Mul, Div };//arr就是函数指针的数组
int i = 0;
for (i = 0; i < 4; i++)
{
int ret = arr[i](8, 4);
printf("%d n", ret);
}
return 0;
}
理解:
(*arr[4])(int, int) = { Add, Sub, Mul, Div }
1.arr[4]说明了是数组
2.(*)(int, int) = { Add, Sub, Mul, Div }说明了数组中存储的内容



