栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习日志四

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习日志四

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机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号