【C语言-B站鹏哥】初识指针
目录
一、指针是什么
二、指针和指针类型
三、野指针
四、指针运算
五、指针和数组
六、二级指针
七、指针数组
一、指针是什么
在计算机科学中,指针 (Pointer )是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为"指针”。意思是通过它能找到以它为地址的内存单元。
指针理解的2个要点:
1. 指针是内存中一个最小单元的编号,也就是地址。(指针:存放地址的变量)
2. 指针变量:用来存放内存地址的变量。
int main()
{int a=10;int* p=&a; //将a的地址存放在p变量中,p就是一个指针变量return 0;
}
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台是8个字节。
二、指针和指针类型
(一)指针的解引用操作
指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
int* p; //*p能够访问4个字节
char* p; //*p能够访问1个字节
double* p; //*p能够访问8个字节
(二)指针 + - 整数
int main()
{int a=0x11223344;int* pa=&a;char* pc=&a;printf("%p\n",pa);printf("%p\n",pa+1);printf("%p\n",pc);printf("%p\n",pc+1);return 0;
}
下面是程序的结果:
总结:通过上面的例子,我们可以知道:
指针类型决定了 指针走一步走多远(指针的步长)
int* p;p+1 --> 4(整型指针+1,往后跳4个字节,一个元素占4个字节)
char* p;p+1 --> 1
double* p;p+1 --> 8
三、野指针
野指针:指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因
1. 指针未初始化
int main()
{//int a;//局部变量不初始化,默认是随机值int *p; //局部的指针变量,就被初始化随机值*p=20; //内存中随便找了个空间,把20放进去了return 0;
}
2. 指针越界访问
int main()
{int arr[10] = { 0 };int *p = arr; //p指向了这个数组的首元素地址int i=0;for (i=0;i<12;i++){p++;}return 0;
}
3. 指针指向的空间释放
int* test()
{int a = 10; //a是局部变量,出了test函数就没有了return &a;
}
int main()
{int *p=test(); //地址虽然返回来了,但是函数一结束,空间返回给系统*p= 20; //指向的是一块被释放的空间return O;
}
如何规避野指针
1. 指针初始化
void main
{int a=10;int* p=&a; //初始化int* p=NULL; //当你不知道要赋什么值的时候,可以赋值NULL}
2. 小心指针越界
3. 指针指向空间释放 即 使置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
四、指针运算
(一)指针 + - 整数
#include<stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};int i=0;int sz=sizeof(arr)/sizeof(arr[0]);int* p=arr; //数组首元素地址给pfor(i=0;i<sz;i++){printf("%d ",*p); //*p就是第一个元素p=p+1; //也可以写成 p++; 向后跳一个元素指向2,以此类推}return 0;
}
//最终结果为:1 2 3 4 5 6 7 8 9 10
(二)指针 - 指针
地址 - 地址
注意:要指向同一个空间
#include<stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};printf("%d",&arr[9]-&arr[0]); //指针-指针,得到的是中间的元素个数(前提:大地址-小地址)return 0;
}
//最终结果为:9
(三)指针的关系运算
指针的比较大小
五、指针和数组
六、二级指针
指向指针的指针
int main()
{int a=10;int* pa = &a;int** ppa = &pa; //ppa就是二级指针int*** pppa = &ppa; //pppa就是三级指针,以此类推,也能写出四级指针return 0;
}
*ppa = 30;
// 等价于 *pa=30;
// 等价于 a = 30;
七、指针数组
指针数组是数组,是存放指针的数组
数组指针是指针。
int main()
{int a = 10;int b = 20;int c = 30;//int* pa = &a;//int* pb = &b;//int* pc = &c;//指针数组用来存放指针//int arr[10]int* arr2[3] = {&a,&b,&c}; //指针数组(整型指针的数组)for(i=0;i<3;i++){printf("%d ",*(arr2[i]));}return 0;
}
//10 20 30
【C语言-B站鹏哥】初识指针相关推荐
- c语言指针和结构体(B站鹏哥讲解版)
一.指针初阶 1.指针类型决定了:指针解引用的权限有多大. char 型改变两个字节,int改变8个字节. 2.指针类型决定了指针走一步走多远. int加4,char加1,double加8 3. 4. ...
- 【鹏哥C语言网课笔记】初识指针
目录 一.指针是什么? 二.指针和指针类型 三.野指针 指针未初始化 指针越界 指针指向的空间释放 如何规避野指针 四.指针运算 指针+-整数 指针-指针 指针的关系运算 五.指针和数组 六.二级指针 ...
- C语言扫雷简化版(b站鹏哥)
前言 扫雷是大部分C语言学习者初期所遇到的步骤比较繁琐的题目,其代码量较大,大致可以分为三部分.该篇文章较适合于初级程序猿阅览. 系列文章目录 扫雷基本介绍 游戏的头文件(game.h) 游戏界面 初 ...
- C语言学习记录——鹏哥二分法查找数组中元素 复习整理
#include <stdio.h> #include <string.h> int main() {//初始化一维整型数组int arr[10] = { 1,2,3,4,5, ...
- 跟着鹏哥学C语言第一天
学习C语言,在我心中可能是一件从小就向往的事情吧,相信很多人都有这个梦想,比如自己做出一款游戏,自己开发出属于自己的一款APP,是一件多么有成就的事情.但梦想不能只是说说而已,要付出行动,所以我开始在 ...
- 【C语言】初识指针(终篇)
摸了一手秀发,发现还在~ 目录 1.指针运算 1.1指针加减整数 1.2指针减指针 1.3指针关系运算 2.二级指针 3.指针和数组 4.指针数组 前言: 大家好,我是拳击哥.上一期我们讲到了指针类型 ...
- [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
文章目录 前言 一,static关键字 二,#define 定义常量和宏 三,初识指针 总结 前言 本节主要记录初识C语言第四节内容. 内容包括:static关键字------#define 定义常量 ...
- 【C语言】深入理解数组和指针——初识指针
哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合 ...
- 第一天学习b站比特鹏哥的视频
前段时间听中国大学慕课翁凯老师的c语言,感觉讲的很少,而且我已经大三了,因为专升本的原因,比人家本科生要基础差得多,专科与本科差的绝对不是一张毕业证,更多的是基础,计算机的思想,我要补的东西还有很多, ...
最新文章
- 如何利用Tensorflow和OpenCV构建实时对象识别程序?
- hbase java 端口_HBase远程Java客户端尝试通过随机端口进行身份验证
- python123组合数据类型答案_Python组合数据类型
- php 删除数组的空元素,php删除数组空元素的方法_后端开发
- Deno + Oak 构建酷炫的 Todo API
- aj6 stamps storm_曝光! “渣男”Travis Scott的AJ6下周发售,分手后货量大减...
- 如何实现一个HTML5 RPG游戏引擎——第五章,实现人物和人物特效
- lduan SCOM 2012 Web控制台(十五)
- 总有一种正能量触动你的心灵,读刘丁宁的一封信
- 音频降噪-fir滤波器
- 记开发过的一款无线音箱解决方案
- 微信小程序——微信小程序后台自定义分析,数据准确性分析
- 楼氏电子推出Raspberry Pi 开发工具包,为新物联网应用和行业语音整合提供支持
- 欺骗的艺术----(8)
- 洛谷——P1413 坚果保龄球
- 杂文 -- 面试重心
- 如何打通AD、企业微信、飞书、钉钉等社交账号及内外网应用身份?
- WPF中WindowFormsHost始终置顶的有效解决方案
- AppScan扫描报告
- linux 中的零拷贝技术,第 2 部分,Linux的零拷贝技术