即时看!【数据结构】指针到底是什么?指针怎么用?
数据结构文章推荐:
——关于指针的一个问题
今天班上的一位学霸在学习数据结构的字符串的时候遇到了一个问题,这个问题就是他在写代码的时候,不管怎么样主函数里就是不能够给指针赋值,就算赋值了好像指针里啥都没有,更别说使用其他函数了。 首先声明一下:这个问题其实并不难,个人认为这个问题只要简单的认识两个点——指针到底是什么?指针到底怎么用?就可以搞懂这个问题了!接下来我会用我认为最简单的思路为有疑惑的同学一步步的讲解,希望各位有耐心的看完,谢谢!!! 话不多说,我模拟了一下当时重要部分的代码,具体如下:
【资料图】
void output(char *chars){int i = 0; while(chars[i]!="\0"){printf("%c",chars[i]); i++; }}int main(){//char chars[] = "abcdefg"; char *chars; int i = 0; while(scanf("%c",&chars[i++])!="\0"){} output(chars); return 0;}
代码分析
1、从上述代码可以看出,output中的一个参数是char的指针,output这个函数目的就是简单的输出一下指针里的东西。 2、主函数中定义了一个名字为chars的字符串指针,并且主函数中试图利用循环对指针进行赋值。 3、主函数对名为chars的指针赋值完毕之后,最后调用output函数将指针的值输出。 没错,你没有看错,就是这么简单的代码!好了,最上述代码的具体功能分析已经结束。
问题分析 & 问题解决
我们再看一下问题:主函数不能给chars这个指针赋值,在运行的时候就是输入一串字符之后就中止进程了,就像这样?: 那么这种问题为什么会出现?其实仔细看代码,其他地方实际上都没有写错,就是这个chars怎么看都不顺眼(实际上当时不是while循环是for循环,当时for循环也有一点小问题,所以这里写成了while) 当时是指针的错误,但是我没有急着说,我在想什么同学会这样写——主函数中有一个chars的指针,output函数中的参数也为chars指针。没错,许多人都有个习惯,那就是认为主函数中要调用自定义函数,那么传过去东西的也必须是和自定义函数一样的(都是指针)!这是我的同学犯错的原因之一。不急着矫正错误,如果顺着其思路走下去,其实想法是没错的。因为在学数据结构的时候有个顺序表,顺序表中有个内容是这样的?:
第一部分//顺序表数据结构typedef struct SqList{Book *elem; //储存空间的基地址 int length; //数据结构的长度};第二部分://初始化顺序表基本算法Status InitList(SqList &BookSystem){//构造一个空的顺序表BookSystem BookSystem.elem = new Book[maxsize]; //分配内存空间 if(!BookSystem.elem)exit(-1); //存储分配失败 BookSystem.length = 0; //当前长度为0 return OK;}第三部分://添加6本图书void insertBook(SqList &BookSystem){int i = 0; //循环变量 for(i;i<6;i++){int index = i; Book newBook; scanf("%s %s %s %s %s %f",&newBook.isbn,&newBook.authorName, &newBook.bookName,&newBook.publisher, &newBook.publishYear,&newBook.price); BookSystem.elem[index] = newBook; }}
当时他说有个地方搞不清,就是结构体中的elem也是个指针,在insertBook函数中也可以用下标形式给指针赋值,所以就按照这个思路写了他的代码。 乍一看好像也对,但仔细看看就不对了,我相信我的同学没有仔细揣摩为什么要有第二部分,而是直接照着第一部分和第三部分写了代码。没有理解到初始化指针的作用,这也是我的同学犯错的原因之二。
问题解决之指针到底是什么?指针的作用方式?
知道了错误之后,就要纠正错误,纠正错误就从两点搞起:1、指针到底是个啥?2、指针到底咋个用?——接下来就以我自己的想法和大家说一说,也许就能解决大家的疑惑了! 首先,指针是个啥?我们都知道指针这东西很重要,这东西就想骇客手里的工具一样,“指”到你的设备,就能入侵你的设备并且还能扒取并修改你设备里的信息,但如果不去“指”,这个工具就缺少了入侵别人设备的途径,也就不能对别人的设备为所欲为了。 上面已经说了指针必须得指到一个东西才能改那个东西。那么看上面代码可以知道,光定义了一个指针,但是没把任何东西的地址给那个指针,那还怎么能给那个指针赋值呢?这就是犯错的第二个原因,没有初始化指针! 这里继续强调一下第二个代码示例中的第二部分,第二部分中将Book数组的首元素地址给了elem指针,所以才能执行第三部分的添加图书的操作的?
BookSystem.elem = new Book[maxsize]; //分配内存空间
好了,到了这里肯定有人会认为:给主函数里的那个指针一个被指的东西不就好了?就像这样?:
int main(){char shuzu[] = "abcdefg"; char *chars = shuzu; int i = 0; while(scanf("%c",&chars[i++])!="\0"){} output(chars); return 0;}
确实,给一个字符数组让指针去指,就可以通过指针给数组赋值了。但还是有一个问题——主函数中调用output函数时传的是指针吗?显而易见,肯定不是,与上面所说的一样,指针通过指向某个值之后再去获取或修改那个值。再看下面的代码?:
void output(char *chars){//输出数组内容...}int main(){//代码略... output(chars); return 0;}
主函数传了个指针chars给output函数,output函数接收到chars之后,chars指向了chars然后执行输出操作,两者都是指针。听着是不是很乱?还记得我说的犯错的原因之一是什么吗?就是取了相同的名字所以容易让人混淆! 我们将主函数中的chars改个名?:
void output(char *chars){//输出数组内容...}int main(){char shuzu[] = "abcdefg"; char *c = shuzu; int i = 0; while(scanf("%c",&c[i++])!="\0"){} output(c); return 0;}
output函数接收到c之后,chars指向了c,如果说chars要取数组的内容那么是这样的:指针chars去找指针c中所指的数组的元素。不管怎么样,这样也太麻烦了。我们直接传数组过去让chars指不就好了吗?这样的话主函数就不用再写什么指针,老老实实写个数组再传就OK了!
int main(){char shuzu[] = "abcdefg"; scanf("%s",&shuzu); output(shuzu); return 0;}
OK,问题解决!
问题总结
我当时看到这个问题的时候,第一眼看过去好像还真是那么回事,从上述的代码分析也可以看出,其实这些代码要干什么我们都懂,但我的那位同学就是遇到了这个‘简单’的问题。 为什么说这个问题是个‘简单’的问题?还是文章开头所说:这个问题其实并不难,个人认为这个问题只要简单的认识指针到底是什么?指针到底怎么用?就可以搞懂这个问题了! 本人水平有限,我认为写一些能给大家帮助的文章非常有必要,同时巩固自己的思想,我认为逻辑思考能力十分重要,希望一些平时有很多疑惑的朋友务必要有思考的精神! 最后,如果大家觉得本文有帮助,记得支持一下哦!大二菜鸟欢迎交流!
标签: 这个问题
相关推荐:
最新新闻:
- 世界观焦点:Tomcat如何配置环境变量?tomcat-8.0.36-x64.zip下载教程
- 天天快播:ibm x201怎么清理内部?联想Thinkpad X201拆机图解
- 微信小程序开发多少钱?怎么看价格成本? 环球今日讯
- 当前短讯!如何查看删除的微信聊天记录?教你2招
- Win8系统如何查看本机ip地址?Win8系统查看本机ip地址的方法 天天信息
- 加密锁的功能有哪些?软件加密锁的功能介绍 世界今热点
- 速读:全市“高质量项目推进年、营商环境突破年、干部作风能力提升年”——高质量发展看园区主题采访活动启动
- 什么是G网?GSM系统有哪些重要特点?_世界滚动
- OEM制造商是什么?OEM行业的硬件术语-环球最新
- 世界热讯:pat文件怎么打开?用这个软件可以打开
- 要闻:如何格式化U盘?教你一招
- 空调df表示什么意思?空调显示df原因分析
- 热点在线丨itunes为什么重装不了?itunes重装方法介绍
- 天天速讯:葡超今日推荐预测:里奥阿维vs阿罗卡比分预测比赛分析 客队能否更上一层
- 电压互感器的作用是什么?电压互感器的电磁结构关系与电流互感器有什么区别?|全球热讯
- 电脑怎么进入bios?教你一个好方法
- 焦点热文:1秒究竟等于多少毫秒?超大时间跨度的感受
- 常见的18种有效的推广方式 你知道几个?-要闻
- 无法启动d3dcompiler文件怎么解决?解决方法-焦点
- 即时看!【数据结构】指针到底是什么?指针怎么用?
- 电脑输入法为什么打不出汉字?修复一下即可 轻松解决
- JAVA的环境变量如何设置?JAVA的环境变量设置步骤-全球动态
- 每日关注!电脑中可以删除CData吗?C盘Roaming里文件能删除吗?
- 热点!win10自带的迈克菲杀毒软件怎么关闭?何时恢复防火墙?
- 【教程】flex-direction属性的使用教程 天天头条
- dell笔记本电脑驱动怎么样?2020笔记本电脑十大新锐品牌|全球视点
- 穿越火线:cf游戏保存的录像文件保存在哪里?
- 每日看点!如何利用Windows提供的API函数?三种常见中文内码的转换方法
- 短线交易有什么技巧?短线交易秘诀 焦点日报
- 什么是网关?网关地址和网关IP是什么? 当前关注
- excel函数有哪些应用技巧?EXCEL常用函数的操作及使用技巧
- 今日视点:如何改善晚上睡不着?怎样提高深度睡眠时间?五个助眠小妙招帮助你快速入睡
- 【世界新要闻】中老联合培养老挝本土中文教师
- 市城管委 环卫机械化作业水平 今年力争达到93% 全球报资讯
- 什么是路由?router和route的区别在哪里?-最资讯
- 购物党App怎么用?手机上的比价工具有哪些?
- 每日精选:gerber文件怎么打开?怎么使用?
- 如何开通微信商城?开通微信商城的三步步骤
- 今日热讯:电影《饥饿游戏:鸣鸟与蛇之歌》新预告 残酷生存逃杀游戏再启
- 什么牌子的硬盘比较好?希捷硬盘怎么样? 全球头条
- 小米路由器设置的ip地址是什么?如何设置密码?
- 电脑系统还原怎么操作?还原电脑系统的具体操作方法
- 空调显示f5是什么意思?是电源电压低于187V吗?|要闻速递
- 新版TP-Link路由器默认密码是多少?tplogin.cn默认密码介绍-天天快消息
- 全球快消息!电脑桌面计算机文件打不开怎么办?电脑开机桌面文件都点不开的解决方法
- 2023广州南沙区云闪付消费券怎么领取? 全球今日讯
- 全球要闻:《红霞岛》实体盘写支持60fps 但小标签却写暂不可用
- 苹果官网买手机可靠吗?苹果官网购买服务有哪些? 每日时讯
- 《红霞岛》全球解锁时间公布:国区5月2日早上8点
- 计算机中ufc是什么意思中文?UFC的英文全称以及中文意思
- 手机连接不上电脑只显示充电怎么办?智能手机的OTG功能介绍
- 如何通过电脑发送短信?如何用数据猫发送接收短消息? 全球滚动
- 每日看点!如何利用Windows提供的API函数?三种常见中文内码的转换方法
- 电脑输入法为什么打不出汉字?修复一下即可 轻松解决
- 全球快消息!电脑桌面计算机文件打不开怎么办?电脑开机桌面文件都点不开的解决方法
- 今日视点:如何改善晚上睡不着?怎样提高深度睡眠时间?五个助眠小妙招帮助你快速入睡
- 台式机使用笔记本电脑上网怎么设置?解决办法 全球新视野
- dell笔记本电脑驱动怎么样?2020笔记本电脑十大新锐品牌|全球视点
- 如何开通微信商城?开通微信商城的三步步骤
- 【全球热闻】面对硬盘磁头损坏问题如何解救?硬盘磁头损坏的解决方案
- NFS如何在windows10下使用及挂载?具体方法流程
- 桌面上计算机快捷方式打不开怎么办?桌面快捷方式打不开解决步骤-环球新资讯
- 电脑系统还原怎么操作?还原电脑系统的具体操作方法
- 格力手机刷机教程:MIUI-N刷机方法 热头条
- 今日热讯:电影《饥饿游戏:鸣鸟与蛇之歌》新预告 残酷生存逃杀游戏再启
- 烫伤图片由一度到三度_烫伤图片 环球速看
- 《装甲核心6》限定收藏版内容公开 机甲雕像精致极品|每日速递
- 【环球快播报】《洛克人EXE合集》全球销量现已突破100万
- 《荊棘:群山之王》登陆全平台发售 北欧传说黑暗世界冒险
- 《红霞岛》全球解锁时间公布:国区5月2日早上8点
- 当前最新:重生:现在还不是开发《泰坦陨落3》的时候
- 世界动态:时组词有哪些_时组词
- 中控技术:4月27日融券净卖出2.04万股,连续3日累计净卖出34.45万股
- 全球观点:4月28日福建地区氢氟酸市场价格暂稳
- 焦点快报!【新思想引领新征程】生态优先绿色发展 绘就万里长江新图景
- 天天热推荐:4月28日江西地区氢氟酸市场价格暂稳
- 交银国际:维持比亚迪股份“买入”评级 目标价309.7港元-每日观点
- 今日精选:柳工2022年度分配预案:拟10派1元
- 南模生物:4月27日融资买入18.97万元,融资融券余额4937.58万元_天天热议
- 到张家界,嗨游“五一”丨全国唯一!张家界100名导游持“急救证”上岗了-环球热讯
- 291.58吨!全国黄金消费量一季度大增12%
- 猛龙已获得面试几位联盟顶级助教的许可 包括勇士助教阿特金森等
- 阳泉:“综合治费”蹚出新路
- “榆”见最美花海 满都海公园邀您来打卡
- 烟台市芝罘区市场监管局凤凰台市场监管所 “多措并举”开展学校食堂及其周边安全大检查