最新要闻
- 40秒看天宇上演“星月神话”:被月亮星星浪漫到了 月牙慢慢掩盖金星
- 热门:完全禁用汽柴油?中石化及专家回应了
- AMD RX 7900 XTX超频3.4GHz:功耗失控650W!还是打不过RTX 4090
- 环球实时:ChatGPT开放第三方插件!瞬间 其他AI成了绝望的文盲
- 快消息!英国监管机构相信微软不会独占CoD
- 全球滚动:安全环保标语8字_安全环保标语有哪些?
- 信息:中国动力电池发展正当其时 锂电隔膜产业乘势而上
- 全球热消息:深圳一公司发文拒招已婚未育员工:回应如此大言不惭
- 世界新动态:郭明錤:iPhone 15全系灵动岛 苹果升级传感器后体验更强大了
- 全球热点评!蜗牛的资料和特点分别是什么
- 4K 3D 高帧率重制!《泰坦尼克号》重映预售开启:4月3日上映
- 热推荐:沪一男子多次在五星级酒店开房,记录和发票被“神秘女”轻松拿走?细思极恐...
- 天天滚动:外卖小哥专属!美团发布头盔新专利:手不脱把接电话
- 【世界报资讯】库克现身北京三里屯正面“面对”小米!网友手持小米13 Pro合影太吸睛
- 当前速看:马斯克要建自己的乌托邦城市:美国当地居民这下不淡定了
- 每日短讯:正式定档4月26日!米哈游大作《崩坏:星穹铁道》公测官宣
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球短讯!12-指针02
【资料图】
指针
回顾
1. 指针的定义
- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
- “*”操作符操作的是指针变量指向的内存空间
#include int main(){int a = 0;char b = 100;printf("%p, %p\n", &a, &b); //打印a, b的地址//int *代表是一种数据类型,int*指针类型,p才是变量名//定义了一个指针类型的变量,可以指向一个int类型变量的地址int *p;p = &a;//将a的地址赋值给变量p,p也是一个变量,值是一个内存地址编号printf("%d\n", *p);//p指向了a的地址,*p就是a的值char *p1 = &b;printf("%c\n", *p1);//*p1指向了b的地址,*p1就是b的值return 0;}
注意:&可以取得一个变量在内存中的地址。但是,不能取寄存器变量,因为寄存器变量不在内存里,而在CPU里面,所以是没有地址的。2.指针大小
- 使用sizeof()测量指针的大小,得到的总是:4或8
- sizeof()测的是指针变量指向存储地址的大小
- 在32位平台,所有的指针(地址)都是32位(4字节)
- 在64位平台,所有的指针(地址)都是64位(8字节)
int *p1;int **p2;char *p3;char **p4;printf("sizeof(p1) = %d\n", sizeof(p1));printf("sizeof(p2) = %d\n", sizeof(p2));printf("sizeof(p3) = %d\n", sizeof(p3));printf("sizeof(p4) = %d\n", sizeof(p4));printf("sizeof(double *) = %d\n", sizeof(double *));
1.野指针
野指针的指向的地址是随机的,不能操作野指针指针指向的地址是系统分配的,定义变量的时候向系统申请,系统进行分配指针初始化的地址不能由自己给出
#include #include #include int main(){// 野指针是指没有初始化(赋值)的指针int *p; // 定义一个指针变量p // *p 指向的是指针变量存储的地址对应的空间// 指针变量p没有存储地址,所以p中存储的地址是随机的(指针的指向是随机的)// 将这样没有初始化的指针称之为野指针*p = 200;system("pause");return 0;}
2.空指针
- int *p = NULL -- 表明定义了一个指针,并将其初始化为NULL,就是指向0所在的地址0x0000 0000;
- 零指针初始化所指向的位置不用于存储其他的地址,只是表明该指针进行了初始化,可以进行使用的标志
- 习惯:将指针使用完之后,置为NULL,这样在使用指针的时候,判断指针指向为NULL,那么该指针可以进行使用,如果该指针不为NULL,表明该指针不能使用(该指针未初始化或者正在使用)
#include #include #include int main(){// 定义一个整型变量,如果不知道存储什么值,可以将a初始化为0int a = 0;// 定义一个指针变量p,如果不知道指针存储谁的地址可以将其// 初始化为0指针,将指针指向0地址,0x00000000 -- NULLint *p = NULL;// *p = 200; // 也不对,p保存了0x000000000,0x00000000是进行初始化的标记,该地址指向的空间不存储值// NULL是指针初始化的标记,指针p指向NULL,表示该指针初始化了,该指针可以使用,// 如果指针 p !== NULL 表明该指针没有初始化,不能使用(或者该指针指向其他地址空间)// 好习惯:将指针用完之后将指针变量指向NULLif(p == NULL) {p = &a;}system("pause");return 0;}
野指针和空指针总结
指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位为4字节,64位为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。
int a = 100;int *p; // p中保存的地址是a的值p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义 // p中保存的地址是任意给的p = 0x12345678; //给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义*p = 1000; //操作野指针指向未知区域,内存出问题,err
但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量(空闲可用),C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针。
int *p = NULL;
NULL是一个值为0的宏常量:
#define NULL ((void *)0)
3. 万能指针
- 可以保存任何地址的指针
- void *p
#include #include #include int main(){// 万能指针,可以保存任意的地址int a = 10; void *p; p = (void *)&a; // printf("%d\n",*p); // 编译出错,指针的类型是void *,取出的长度为sizeof(void) // sizeof(void) -- 编译器不知道多大 -- 编译出错 // p指针变量保存的是a的地址,p的类型是void *类型 // 想要取出p中的变量 -- 需要将p指针类型从void * 转为int * printf("%d\n",*(int *)p); // *(地址) -- 将地址进行强转 *((int *)地址) // 不可以定义void类型的变量 // 但是可以定义void *类型,因为指针都是4个字节 // void b; 出错 void *b;system("pause");return 0;}
- 通过万能指针取内容的时候,需要将万能指针类型转变为取值的指针类型
4.const修饰的指针变量
- const -- 修饰变量a之后,不能通过a变量名修改a在内存中的值
- 但是可以通过地址进行修改a的内容
#include #include #include int main(){// const修饰变量a,不能再通过a修改a内存里面的内容// 但是可以同过地址进行修改a的值const int a = 10;int *p = &a;*p = 100;printf("%d\n",a); // 100system("pause");return 0;}
- const int p = &a -- const修饰,不能通过*p修改指向空间的内容
- int * const p = &a -- const修饰指针变量p,p中所保存的地址不可被修改
#include #include #include int main(){int a = 10;int b = 20;// const修饰的是*还是变量p?// 这里修饰的是*const int *p = &a; // 不能通过*p修改p所指向的空间的内容// *p = 100; const修饰*之后,不能通过p修改p指向的空间的内容// const 修饰指针变量p// p保存的地址不可以被修改int * const p = &a; p = &b; // p保存的地址不可以被修改 // p本身的指向不能改变,不同通过*p修改p所指向的空间的内容const int *const p = &a; system("pause");return 0;}
5.多级指针
#include #include #include int main(){int a = 10;// 定义指针变量p保存a的地址// *p int a int *pint *p = &a;// 想要定义一个变量保存p的地址// int *q int *p int *(*q)int **q = &p;// 通过q得到a的值// 通过q得到a的地址 -- *q 表示p的地址的内容就是a的地址// **q -- 取a地址中的内容// **q = *(*q) = *(p) = a// **q = *(*q) = *(&a) = a // *(地址) 表示取地址中的内容// *与&相遇 -- 相互抵消// 定义变量保存q的地址// *k int **q int ***keyint ***k = &q;// ***k = *(**K) = *(*(*k)) = *(*(&p)) = *p = *(&a) = aint **********g;int ***********h = &g; // 保存指针类型变量地址,多一个*// ********** *h = ********** *(&g) = *********g//分析// *与符号结合,表示变量k是一个指针变量// k是一个变量// k的类型// k用来保存地址的类型,将k与最近的*进行拖黑,剩下的就是保存地址的类型system("pause");return 0;}
int a = 10;int *p = &a; //一级指针*p = 100; //*p就是aint **q = &p;//*q就是p//**q就是aint ***t = &q;//*t就是q//**t就是p//***t就是a
6. 指针与数组
#include #include #include int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};// a 数组名 首元素的地址 - a = &a[0]// 知道首元素地址 --> a+1 = &a[1]// 定义指针保存首元素地址 -- 首元素地址类型是int// a 数组名只能指向首元素地址,通过指针可以指向数组中其他元素地址int *p = a; // &a[0]// *p -- 可以取a[0]的值int *q = &a[5]; // *q 可以取a[5]的值system("pause");return 0;}
#include #include #include int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};// a 数组名 首元素的地址 - a = &a[0]// 知道首元素地址 --> a+1 = &a[1]// 定义指针保存首元素地址 -- 首元素地址类型是int// a 数组名只能指向首元素地址,通过指针可以指向数组中其他元素地址// 操作数组元素int *p = a;//指针p保存的是首元素地址&a[0]for(int i = 0;i
例题
int main(){ int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a+1); printf("%d %d\n",*(a+1),*(ptr-1)); // 2 5}
- 数组地址加一,跨一个数组
- 元素地址加一跨一个元素
- 指针加一跨元素类型步长
- int *p -- 步长就是sizeof(int)\
- 要得到内存的数据,就要先得到数据的地址 -- *(地址)得到的是地址中的内容
- *(指针变量) -- 指针变量存储的是地址 -- *(地址)-- 得到指针变量存储的地址的内容
7.指针的运算
- 指针的加减运算与步长有关
- 指针变量相加没有意义
- 指针变量相减可以得到之间的数组元素
- 两个指针的变量相减,需要保证指针的类型一致
#include #include #include int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};int *p = a;// &a+1跨整个数组// &a+1的步长是整个数组,想要前一个元素的地址,在减去一个int类型的变量长度// 将&a+1地址转变为int * -- 表示其步长为sizeof(int)// (int *)(&a+1) - 1 得到数组最后一个元素地址// 得到数组的最后一个元素,(int *)(&a+1) int *q = (int *)(&a+1)-1;// 指针相减 -- 得到之间元素的个数printf("%d\n",q-p); // 9printf("%d\n",*(p+3)); // 取第四个元素的值,4// c语言中,两个指针变量相加是没有意义的printf("%d\n",p+q); // 报错system("pause");return 0;}
8.[]使用
- []不一定只给数组使用
- [] == *()
- p[0] == *(p+0);
#include int mian(){// [] 不是数组的专属// int a[10] = {1,2,3,4,5,6,7,8,9,10};int a = 10;int *p = &a;// [] == *() // p[0] == *(p+0);p[0] = 100;// 这里a = 100,表示p[0] = 100,对其内容进行操作printf("a = %d\n",a); // a = 100system("pause");return 0;}
数组中的使用
#include #include #include int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};int *p = a;//指针p保存的是首元素地址&a[0]for(int i = 0;i
9.指针数组
指针数组,它是数组,数组的每个元素都是指针类型。
#include #include #include int main(){int a = 10;int b = 20;int c = 30;// 保存三个int类型数据的指针需要定义三个指针// 如果数据多了之后就比较麻烦// int *p = &a int *q = &b int *k = &c// 需求:数组中的每一个元素都是指针(地址)// 指针变量的类型 数组名[长度] = {初始化值}; 初始化的是地址int *num[3] = {&a,&b,&c};// int *占4个字节printf("%d\n",sizeof(num)); // 12// 用指针数组或区域元素// 打印a的地址printf("a:\n",*num[0]);printf("b:\n",*num[1]);printf("c:\n",*num[2]);for(int i = 0;i
关键词:
-
全球今亮点!C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别
在C++中,虚函数(virtualfunction)是一个可以被子类重写的成员函数,而纯虚函数(purevirtualfunction...
来源: 环球短讯!12-指针02
全球今亮点!C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别
40秒看天宇上演“星月神话”:被月亮星星浪漫到了 月牙慢慢掩盖金星
热门:完全禁用汽柴油?中石化及专家回应了
AMD RX 7900 XTX超频3.4GHz:功耗失控650W!还是打不过RTX 4090
环球实时:ChatGPT开放第三方插件!瞬间 其他AI成了绝望的文盲
快消息!英国监管机构相信微软不会独占CoD
全球滚动:安全环保标语8字_安全环保标语有哪些?
信息:中国动力电池发展正当其时 锂电隔膜产业乘势而上
世界今日报丨使用 PC 端浏览器开发者工具对移动端真机环境 Web 页面进行远程调试
每日看点!Microsoft edge锁定在任务栏上,被修改主页360的解决方法
全球热消息:深圳一公司发文拒招已婚未育员工:回应如此大言不惭
世界新动态:郭明錤:iPhone 15全系灵动岛 苹果升级传感器后体验更强大了
全球热点评!蜗牛的资料和特点分别是什么
天天新消息丨Midjourney AI绘画使用指南
Django笔记七之ManyToMany和OneToOne介绍
4K 3D 高帧率重制!《泰坦尼克号》重映预售开启:4月3日上映
热推荐:沪一男子多次在五星级酒店开房,记录和发票被“神秘女”轻松拿走?细思极恐...
【金融街发布】人民银行:2月发行各类债券54724.3亿元
债市日报:3月24日
天天滚动:外卖小哥专属!美团发布头盔新专利:手不脱把接电话
【世界报资讯】库克现身北京三里屯正面“面对”小米!网友手持小米13 Pro合影太吸睛
当前速看:马斯克要建自己的乌托邦城市:美国当地居民这下不淡定了
每日短讯:正式定档4月26日!米哈游大作《崩坏:星穹铁道》公测官宣
快消息!PaddleOCR之高性能Go语言实现OCR识别
环球报道:《暗黑破坏神4》新手入门图文攻略:游戏系统介绍与开荒指南
天天日报丨男孩名字含“坤”被嘲笑抑郁自残 被起绰号“鸡哥”:网友吐槽太过分
环球要闻:监控拍到浙江一车辆撞倒行人后又倒回碾压!官方通报来了
全球快资讯丨金价一路狂飙 有人8斤黄金变现174万:国内中老年狂买 还有人已赚32万元
世界热头条丨暴雪计划进行压力测试:《暗黑破坏神4》公测版排队依旧
以志愿服务赋能基层治理,金山卫镇这样做
9个都要了解的单行Python代码
每日看点!优化不够DLSS来凑 iGame RTX 4080显卡实战《卧龙》:4K轻松百帧
环球热点!男子驾车疯狂违章 上传视频炫耀自曝!后续舒适
169元 红魔散热器4磁吸版上市:20W满血功率、可控RGB灯效
环球热讯:苹果CEO库克现身北京三里屯零售店!众多粉丝合影 有人用小米13自拍
上海嘉定新城发展完成5亿元中票发行 利率3.20%
环球速讯:Leetcode Practice -- 字符串
第133篇:事件处理与常用事件
每日简讯:PLG SaaS 产品 Figma 商业模式拆解
1.爬虫的简介
世界时讯:python超时处理方法eventlet的eventlet.Timeout
全球资讯:【新华解读】REITs推出支持消费重要举措 消费基础设施可发行REITs
环球通讯!【财经分析】瑞信债务减记外溢影响可控 欧洲其他大型银行信用状况未受波及
【金融街发布】证券公司App“一键打新”功能将迎三大变化
每日热议!电池连续6年世界第一 宁德时代表态不会去造车
环球精选!95后设计师辞职当动物饲养员:上班以后非常开心
小金刚品质 Note 12 Turbo首发福利:免费送碎屏险
世界今头条!PC真的没落了!我国网民使用手机上网比例达99.8%:占比遥遥领先
每日关注!2023年国剧最高分!剧版《三体》豆瓣涨至8.7分:超36万人评价
焦点报道:windows安装redis及配置教程
世界微速讯:记一次若依后台管理系统渗透
焦点!记录--用three.js渲染真实的下雨效果
傲软录屏工具使用教程(附工具亲测有效!!!)
天天视点!国际货币基金组织敦促黎巴嫩加快改革以启动一揽子救助计划
全球简讯:论文阅读笔记(五):Hire-MLP Vision MLP via Hierarchical Rearrangement
【焦点热闻】73.迭代器
环球观察:[vue] 脚手架笔记
世界动态:别让疲劳成为你的最后一程路:如何避免驾驶疲劳?丨曼孚科技
前沿资讯!L2-040 哲哲打游戏
每日快看:【新华500】新华500指数(989001)24日跌0.29%
谷歌回应Bard内容“抄袭”:插入链接会打断对话
快资讯丨浙江2人遭雷击不幸身亡 急救中心发布雷雨天出行提示
0糖0脂肪 丘里福建大红袍、铁观音茶饮闭眼囤:券后6瓶15.8元
天天新动态:最远能跑333km 五菱缤果官宣3月29日上市:7万交个朋友?
认真做优化 Intel显卡驱动容量减少一半:从1.3GB降至0.6GB
天天速递!全国跳水冠军赛:昌雅妮成为女子3米板“双冠王 ”
环球快讯:MySQL错误ERROR 2003 (HY000) Can't connect to MySQL server .' (111)
CSP20230319-4 星际网络II 题解
焦点信息:DNF远古地下城怎么开
天天观点:抵制汽车行业网络水军!比亚迪、长城、蔚小理等发起联合倡议
萤石TV Studio发布:接管电视“大脑” 让一屏秒变三屏!
【世界快播报】灯座安装即插即用:萤石发布4G款灯座云台摄像机C8b
环球新动态:比亚迪宋Pro DM-i 2023款实车曝光:前脸大变 加长加高
【全球新视野】2023第三届大湾区数字峰会在广州召开
环球快看点丨开心档之Go 语言数据类型
C#中?.、??、?:、及?等符号用途
看热讯:泛型的学习
关于工作态度和责任心的句子有哪些?工作态度自我评价模板
燃野少年的天空老狗最后和谁在一起了?燃野少年的天空演员表
春联横批是从左到右还是从右到左?通用的春联横批大全
大玉儿是不是孝庄太后?大玉儿爱多尔衮还是皇太极?
郭晓婷和袁弘是什么关系?郭晓婷演过的电视剧有哪些?
比亚迪新专利获授权 通过手背静脉识别控制车辆
当前滚动:玩家搜集信息拼凑《GTA6》地图:比洛圣都要大3倍
腾讯把《和平精英》里的技术引入输入法和地图 1700万人受益
HTTP请求方法
每日聚焦:RTX 4080 Ti运行《暗黑破坏神4》变砖:暴雪与NVIIDIA进行联合调查
广州突降冰雹 车主晒特斯拉玻璃车顶快被砸烂
中国电竞酒店突破2万家:西安郑州最多 玩家不止玩游戏
13代标压i5还有军工级品质!华硕a豆14 2023笔记本评测:智能远控 直击痛点
被曝垃圾桶捞回食材上桌!网红店半天妖发布致歉声明
全球快讯:2023年八字运势查询 乙酉日柱事业好
环球快资讯:SaaS 营销,如何利用 RPA 实现自动化获客?
全球视点!保姆级教程!玩转 ChunJun 详细指南
python入门语法
灵感来自中国:俄罗斯电视台首次推出AI女主播
全球关注:“大嫂”高叶代言!《原始征途》手游公测:史玉柱亲自研发
每日快看:碳酸锂价格暴跌一半!特斯拉还会再降价?
环球要闻:支付宝首页能直接刷短视频了 新增“看一看”入口