C语言指针看这一篇就够了

本文介绍了指针作为地址的概念,通过变量名和地址两种方式访问内存。指针变量用于存储地址,*运算符用于取址。文章强调了不同类型的指针在内存管理和数据交换中的重要性,例如在函数参数传递中避免值拷贝。此外,还讨论了指针与数组的关系,包括指针对数组的引用,以及二维数组的地址解析。最后,提到了函数指针、指针数组和多级指针的概念及其用途。
摘要由CSDN通过智能技术生成

师承clc

认识指针

指针==地址

我们访问变量有两种方式:1.变量名直接访问,2.地址间接访问

比如访问女朋友定的酒店:

  • 1.xxx酒店xxx主题房间 --变量名访问

  • 2.福建省鼓楼区xxx路xxx号313房间 --地址访问

通过地址也能访问,& 取地址运算符,* 将地址内的值读出运算符

指针变量==存放地址的变量

如何定义一个指针变量
  • *的标识的作用,只产生在指针变量定义或声明的时候

如何使用一个指针变量

*的运算运用,如上图代码的*p,*(&a)

访问变量的两种方式

所谓的间接防访问的方式就是用指针的方式。

区分指针类型

指针是存放地址的变量,但是不同类型的指针

  • 指向空间的大小是不一样的,有可能会造成取值的问题丢失数据。

  • 指针的增量也可能会不同

  • int *a 和char *b在 a++和 b++时他们的地址增量是不同的

为什么要用指针

  1. 我们来举个很简单的例子,实现一个封装函数,实现两个数的交换

有不同的两份代码,我们来看一下

运行后,我们可以发现,只有用了间接访问把地址传给函数的第二份代码,运行的结果才是正确的,在第一份代码里,调用changeData(data,data2),实际上函数是进行了值拷贝,虽然函数里的data和main函数里的data看起来一样,但是他们的地址是不同的,只有把他们的地址进行交换,才是真正进行了数据交换。

2.在单片机,armbootloader的开发当中,我们经常需要指针指向固定的地址。

练习

输入三个数a,b,c; 要求不管怎么输入,在输出的时候,a,b,c就是由大到小的顺序输出,用函数封装实现

通过指针 引用数组

定义一个指针变量指向数组

int *p;
p = a = &a[0];

指针增量和数组的关系

通过指针引用数组元素

注意:p要指回首地址,p = arr;

访问数组元素

  • 下标法a[0],a[1]
  • 指针法
  • 偏移
  • 取内容
  • 见怪不怪:
1.指针当做数组名,下标法访问
2.数组名拿来加
  • 数组名和指针的区别:
  1. a++可否?:
  • 常量指针 -- 数组名 ,不能改变首地址的位置,

arr++ 即 arr = arr+1 改变了首地址的位置

  • 指针变量 -- *p

  1. sizeof的时候

两种方法效率对比

练习

函数封装数组初始化,遍历
将数组中的n个元素按逆序存放

指针和二维数组

概念

二维数组中上官特有说法:父子数组为了研究清楚地址的概念,把二维回归到一维数组

a[1] == &a[1][0];//
  • a[1]不是元素而是数组名,是子首地址。

  • a表示二维数组(父数组)的地址

  • a[0] , *a 表示子数组的地址

那么a[0]+1又是什么意思呢

//在二维数组里
arr[0] == *(arr+0);
arr[0]+1 == *(arr+0)+1;
  • a[0]+1第0行第一列的地址,是地址的意思 == *(a+0)+1

  • 也可以说是第0个子数组的第1个元素的地址

  • 而第0个子数组的第1个元素表示方式是a[0][1],不要乱

提示

进阶

思考

解答:它们只是值相等,但类型不相等,a+1是int **类型,指向的是数组a的第二行的首地址; *(a+1)是int *型,指向的是数组a的第二行第一个元素的地址。

小总结,嵌入式笔试题可能考

数组指针

指向数组的指针 int(*p)[5]

指向一个含有4个元素的数组:

输出二维数组任意行列的数:

函数指针

定义“函数地址”

函数名就是地址 --类似--数组名就是地址

如何定义一个函数指针变量

  • 跟普通变量一样

int getData(int a, int b);

int (*p)(int a,int b)

使用函数指针

函数调用概念和变量一样

好用之处

  • 根据程序运行过程的不同情况,调用不同的函数

  • java接口

  • 回调函数的底层逻辑

  • 线程

  •  int pthread_create(pthread_t *id,const pthread_attr_t *attr, void*(*start_rtn)(void*), void *restrict arg);

  • QT的信号与槽

练习

指针数组

概念

定义,注意和数组指针的区别,面试的笔试题会考

它是数组,数组的每一项都是一个指针变量

指针函数--返回指针值的函数

概念

练习

二级(多级)指针

认知考虑的时候,其实所有东西跟一级指针一样,写法int **p

差别就是保存的是指针变量的地址

当你通过函数调用来修改调用函数指针指向的时候,就像通过函数调用修改某变量的值的时候一样

二级指针不能简单粗暴指向二维数组

总结

后面还会更新结构体指针等等。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值