C的学习来到了最重要的部分->指针
1.什么是指针
指针是编程语言里的一个对象,他的值直接指向存在电脑存储器中的另一个地方的值,由于通过地址能找到所需的变量单元,也可以这样说,地址指向该变量单元,因此,将地址形象化说成“指针”。 -------可以通过“指针”找到以他为地址的内存单元
总结------指针就是个变量,存放内存单元的地址(编号)
2.指针和指针类型
指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
eg
int*p *p可以访问4个字节
char* p *p可以访问1个字节
double*p *p可以访问8个字节
指针类型决定了指针走一步能走多远(指针的步长,距离)
eg
int*p p+1-> 4
char*p p+1->1
double*p p+1->8
3.野指针
指针指向的位置是不可知的 随机的 不正确的 没有明确的
1.指针不初始化 // int a 局部变量不初始化则默认是随机值
int*p 局部指针变量不初始化 默认是随机值
2.指针越界访问
//当指针指向的范围超出数组的范围时,p就是野指针
3.指针指向的空间释放(动态内存开辟)
如何规避野指针呢?
1.指针得初始化
2.指针得小心别越界啦
3.指针指向的空间释放则立马设置为NULL
4.指针使用前得检查有效性
4.指针的运算
*指针+-整数
*指针-指针
*指针的关系运算
5.指针和数组
arr数组名 取arr的地址 则是首元素的地址&arr
sizeof(arr) sizeof(数组名)数组名表示的整个数组 sizeof(数组名)计算的是整个数组的大小。
6.二级指针 可以变多级指针 套娃
int a = 10;
int *pa = &a;
int **ppa = &pa;
7.指针数组和数组指针
在后面的指针进阶会详细介绍
指针数组(本质数组)存放指针的数组 int* arr[3] = {}
数组指针(本质指针)
现在我们对指针有了初步认识,现在详细分析指针 指针进阶
1.字符指针
char ch = 'w'
char*p = &ch
char* p = “abcdef”//abcdef是一个常量字符串
printf打印出a %c
printf 打印出abcdef %s
const 这是静态 作用不能修改
热知识:segmentfault.com
segmentfault 意为段错误
段错误 就是指访问的内存超出了系统所给的这个程序的内存空间
2.数组指针
数组指针 本质指针 是指向数组的指针 int(*p) [10] = &arr;
将数组的地址存放起来
3.指针数组
指针数组 本质数组 存放指针的数组
int arr [10] //整形数组
int* arr[10] //整形指针的数组
4.数组传参和指针传参
函数是需要参数的 所以不仅可以传int char double 还可以传数组和指针
一维数组的传参 arr[ ](你可以传指针变量和地址)
1.一级指针本身
2.该变量的地址
二维数组的传参arr [ ] [ ]
1。二级指针本身
2.一级指针的地址
3.存放一级指针的数组名
总结 二维数组传参 函数形参的设计只能忽略第一个[ ]
因为对于二维数组来说 可以不知道有多行 但必须知道一行有多少个元素
二维数组传参 void* test (int (*arr)[5])
5.函数指针
函数的地址: &函数名 或 函数名 都是函数的地址
%p 作用打印地址
函数指针的书写
int(*pa)(int,int) = Add;
*pa 是指针 (int , int)是两个参数类型
int 是返回值 Add是函数名
使用函数指针 (*pa)(2,3)
来自《c陷阱和缺陷》
(*(void(*)()0) ();这段代码的含义 调用一个0地址处内的参数为无参,返回类型为void的函数
函数指针 int(*函数名)(参数1,参数2)
6.函数指针数组
int* arr[5]; //指针数组 需要一个数组 这个数组可以存放4个函数的地址
int(*parr[4])(int,int)={Add,Sub,Mul,Div};
printf(“%dn”,parr[i](2,3));
//函数指针的数组
函数指针数组的用途:转移表 例子计算器
用函数指针数组的形式 可以简化
7.指向 函数指针数组 的指针 (是一个指针指向一个数组 数组的元素都是函数指针)
int(*p)[10] = &arr; //取出数组的地址
int (*pfArrr[4])(int,int); //pfArr是一个数组 函数指针数组
int(*(*ppfArr)[4])(int,int) = =&pfArr ;
//ppfArr是一个数组指针,指针指向的数组有4个元素
函数指针 函数指针的数组 指向函数指针数组的指针
pow(a,b)
#include
//头文件 result = pow (a,b);//计算a的b次方
8.回调函数
回调函数就是一个通过函数指针调用的函数 (你拿到一个函数的地址 就可以调用那个函数)如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这个是回调函数,回调函数不是由该函数的实现直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
print(char*str)
{
printf("hehe:%s",str);
}
void test(void(*p)(char*))
{
printf("testn");
p("bit");
}
test(print);
output:
hehe: bit
在函数内部 想调用p的时候 调用print函数称为 回调函数
9.指针和数组面试题的解析
暑期编程PK赛 得CSDN机械键盘等精美礼品!


