首页 > 语言 > 关键词 > C语言指针最新资讯 > 正文

C语言指针5分钟教程

2012-09-25 10:27 · 稿源:伯乐在线

指针、引用和取值

什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。本文会对上述所有指针类型进行探讨。

根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。

&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。

// 声明一个int指针
int *ptr;
// 声明一个int值
int val = 1;
// 为指针分配一个int值的引用
ptr = &val;
// 对指针进行取值,打印存储在指针地址中的内容
int deref = *ptr;
printf("%d\n", deref);

第2行,我们通过*操作符声明了一个int指针。接着我们声明了一个int变量并赋值为1。然后我们用int变量的地址初始化我们的int指针。接下来对int指针取值,用变量的内存地址初始化int指针。最终,我们打印输出变量值,内容为1。

第6行的&val是一个引用。在val变量声明并初始化内存之后,通过在变量名之前使用地址操作符&我们可以直接引用变量的内存地址。

第8行,我们再一次使用*操作符来对该指针取值,可直接获得指针指向的内存地址中的数据。由于指针声明的类型是int,所以取到的值是指针指向的内存地址存储的int值。

这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。

void指针、NULL指针和未初始化指针

一个指针可以被声明为void类型,比如void *x。一个指针可以被赋值为NULL。一个指针变量声明之后但没有被赋值,叫做未初始化指针。

int *uninit; // int指针未初始化
int *nullptr = NULL; // 初始化为NULL
void *vptr; // void指针未初始化
int val = 1;
int *iptr;
int *castptr;
 
// void类型可以存储任意类型的指针或引用
iptr = &val;
vptr = iptr;
printf("iptr=%p, vptr=%p\n", iptr, vptr);
 
// 通过显示转换,我们可以把一个void指针转成
// int指针并进行取值
castptr = (int *)vptr;
printf("*castptr=%d\n", *castptr);
 
// 打印null和未初始化指针
printf("uninit=%p, nullptr=%p\n", uninit, nullptr);
// 不知道你会得到怎样的返回值,会是随机的垃圾地址吗?
// printf("*nullptr=%d\n", nullptr);
// 这里会产生一个段错误
// printf("*nullptr=%d\n", nullptr);

执行上面的代码,你会得到类似下面对应不同内存地址的输出。

iptr=0x7fff94b89c6c, vptr=0x7fff94b89c6c
*castptr=1
uninit=0x7fff94b89d50, nullptr=(nil)

第1行我们声明了一个未初始化int指针。所有的指针在赋值为NULL、一个引用(地址)或者另一个指针之前都是未被初始化的。第2行我们声明了一个NULL指针。第3行声明了一个void指针。第4行到第6行声明了一个int值和几个int指针。

第9行到11行,我们为int指针赋值为一个引用并把int指针赋值为void指针。void指针可以保存各种其它指针类型。大多数时候它们被用来存储数据结构。可以注意到,第11行我们打印了int和void指针的地址。它们现在指向了同样的内存地址。所有的指针都存储了内存地址。它们的类型只在取值时起作用。

第15到16行,我们把void指针转换为int指针castptr。请注意这里需要显示转换。虽然C语言并不要求显示地转换,但这样会增加代码的可读性。接着我们对castptr指针取值,值为1。

第19行非常有意思,在这里打印未初始化指针和NULL指针。值得注意的是,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原因。最好的情况是你取到的是垃圾地址接下来你需要对程序进行调试,最坏的情况则会导致程序崩溃。

NULL指针被初始化为o。NULL是一个特殊的地址,用NULL赋值的指针指向的地址为0而不是随机的地址。只有当你准备使用这个地址时有效。不要对NULL地址取值,否则会产生段错误。

指针和数组

C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。

一个数组变量是一个常量。即使指针变量指向同样的地址或者一个不同的数组,也不能把指针赋值给数组变量。也不可以将一个数组变量赋值给另一个数组。然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。

int myarray[4] = {1,2,3,0};
int *ptr = myarray;
printf("*ptr=%d\n", *ptr);
 
// 数组变量是常量,不能做下面的赋值
// myarray = ptr
// myarray = myarray2
// myarray = &myarray2[0]

第1行初始化了一个int数组,第2行用数组变量初始化了一个int指针。由于数组变量实际上是第一个元素的地址,因此我们可以把这个地址赋值给指针。这个赋值与*ptr = &myarray[0]效果相同,显示地把数组的第一个元素地址赋值到了ptr引用。这里需要注意的是,这里指针需要和数组的元素类型保持一致,除非指针类型为void。

指针与结构体

就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址。与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型。

struct person {
  int age;
  char *name;
};
struct person first;
struct person *ptr;
 
first.age = 21;
char *fullname = "full name";
first.name = fullname;
ptr = &first;
 
printf("age=%d, name=%s\n", first.age, ptr->name);

第1至6行声明了一个person结构体,一个变量指向了一个person结构体和指向person结构体的指针。第8行为age成员赋了一个int值。第9至10行我们声明了一个char指针并赋值给一个char数组并赋值给结构体name成员。第11行我们把一个person结构体引用赋值给结构体变量。

第13行我们打印了结构体实例的age和name。这里需要注意两个不同的符号,’.’ 和 ‘->’ 。结构体实例可以通过使用 ‘.’ 符号访问age变量。对于结构体实例的指针,我们可以通过 ‘->’ 符号访问name变量。也可以同样通过(*ptr).name来访问name变量。

总结

希望这份简短的概述能够有助于了解不同的指针类型。在后续的博文中我们会探讨其它类型的指针和高级用法,比如函数指针。

欢迎提出提问并给出评论。

英文原文:Dennis Kubes 编译:伯乐在线 – 唐尤华

网友热搜:

  • 相关推荐
  • 大家在看
  • 编程语言最新排名:Java最受欢迎、JS用户最多

    IDE工具开发商JetBrains基于2万名开发者,对编程语言的最新情况进行了统计描摹。就受欢迎程度而言,Java高居第一位,但在使用人数上,JavaScript则名列榜首。欢迎程度的统计方法是,让参与的

  • 报告:JavaScript为最常用整体编程语言 Python超过Java

    在过去的 12 个月中,Python在使用的编程语言列表中已经超过了Java,它也是被研究最多的语言。报告称,在过去的 12 个月里,30%的受访者开始或继续学习Python,甚至比去年还要多。

  • 读懂生命的“语言” 有孚专有云为基因行业提速

    基因图谱被称为"上帝用以创造生命的语言"。世界各国的科学家们都在倾尽全力读懂“生命的语言”,破解每一个未知基因的奥秘。读懂“生命的语言”,对于提高公众健康水平,降低沉重的医疗费用具有非常重要的意义。读懂生命的"语言",实现科学的价值基因技术听起来很神秘,但其实早已经在多个领域中得到应用。例如基因测序技术能够用于疾病的预防、疾病的诊断、指导个体化用药,还能够帮助病毒基因研究所研发病毒诊断试剂,监控病毒疫

  • 华为全球最大旗舰店上海开业 可提供近10门语言服务

    今日上午10点8分,上海南京东路华为全球最大旗舰店开业,有粉丝表示自己8点多就已过来排队。据悉,该旗舰店坐落于 “中华商业第一街”南京东路的南京大楼,具体位置为上海市南京东路 233 号,占地面积超过了 5000 平方米。

  • 携手体育赛事,英孚教育成为成都2021年大运会语言服务类供应商

    近日,成都 2021 年第 31 届世界大学生夏季运动会品牌发布推介会(上海站)举行。在会上,英孚教育正式签约成为 2021 年第 31 届世界大学生夏季运动会语言服务类供应商。据介绍,在 2021 年成都大运会筹备和比赛期间,英孚教育企业与政府解决方案将为大运会筹委会的工作人员、志愿者以及相关政府机构工作人员提供一系列语言培训服务,包括定制化在线课程、志愿者培训、在线测评等。在签约活动现场,英孚教育企业与政府解决方案中国

  • 风变编程:两会丁磊提议将编程纳入考试,编程学习是否已是大势所趋?

    最近,关于编程教育是否纳入教学的讨论再次在网络上发酵,引发了全民大讨论。在5月21日举行的第十三届全国人民代表大会第三次会议上,全国政协委员、网易CEO丁磊在《关于稳步推动编程教育纳入我国基础教学体系,着力培养数字化人才的提案》中建议:加快区域试点,形成从高中向小学、从东部向全国的推广格局;创新教学模式,形成中国特色的少儿编程课程体系;教企共建少儿编程学习资源库,提供实践平台;将少儿编程纳入学业水平考试

  • Java已被超越?Python当道,风变编程带你化身编程高手

    在程序员中,一直流传着“Python除了不会生孩子,什么都会”的传说。作为人工智能时代最重要的脚本语言之一,Python现在已经逐步占领统计学、机器学习、爬虫、图形处理、软件和游戏开发、人工智能等多个领域,且都有突出表现。可以说,在众多编程语言中,python如今已经杀出重围,从容超越Java和Javascript,化身程序员必备的编程利器之一。目前,国内外许多公司都已使用Python,如:YouTube、豆瓣、知乎、Google、百度、腾讯、美?

  • 中国内存又多一家!雷克沙正式进军内存

    提起“雷克沙”(Lexar),关注存储尤其是闪存存储的玩家应该都很熟悉,它来自美国硅谷圣何塞,2006年被美光收购。2017年8月,雷克沙又被中国深圳江波龙(Longsys)收入囊中,变成了一个

  • 包装出来的「国标」等级考试,编程猫们收割了谁?

    ​一位一线儿童编程教育工作者称,细数市场十余种等级标准与考试,鱼龙混杂、质量参差不齐,一些感觉不是在推进青少年编程教育,而是在抢占编程教育市场制高点。

  • 极客晨星讲解:火爆的少儿编程有着怎样的发展史?

    未来的世界是人工智能的时代,这个已经成为了不争的事实。而国内近几年来对少儿编程的关注也说明了不少家长也希望孩子能够学习少儿编程,从而适应未来的人工智能。那么少儿编程到底是什么发展起来的呢?国内少儿编程培训的现状又是什么样的?下面极客晨星就为您来详细讲解一下。2000 年以色列编程兴起; 2012 年日本改课推广编程; 2013 年奥巴马呼吁全国学编程; 2014 年英国把编程纳入必修课; 2015 年美国政府出资 40 亿强化中小学?

  • C男控是什么意思 C男控是什么梗

    最近不少的小伙伴在网络看到一个比较有趣的词语——C男控,很多人不了解什么是C男控,这个到底代表什么意思呢?下面就来为大家分享一下C男控这个梗。

  • Python取代Excel?风变编程带你了解如何更好地学Python!

    当前最简单、最流行的编程语言是什么?是Python。最近,谷歌公布的编程语言流行指数显示,Python目前仍然是全球范围内最受欢迎的技术语言。而得益于简洁、易读、易维护等特点,Python可广泛运用于数据分析、人工智能、爬虫、运维、测试、图像识别、机器学习等领域,在日常数据分析方面,甚至已有“Python取代Excel”的说法。那么,Python是否真的有这么牛?接下来,风变编程就带你了解一波。“Python已经取代了Excel”今年3月,日?

  • OKEx C2C借贷上线WEB端 产品矩阵愈加完善

    随着加密货币市场对稳健理财强烈需求的显现,C2C借贷逐渐成为加密货币市场布局的新赛道。近日,全球著名的加密货币交易平台OKEx上线C2C借贷功能WEB端,再次为行业发展注入强劲动能。三步完成借币继3月19日在APP端全面上线C2C借贷功能后,OKEx产品线再添新成员,于6月23日宣布其C2C借贷功能现已上线WEB端。用户可前往OKEx官网进行借币操作,通过质押BTC或ETH借到USDT,实现资金的灵活周转。整个借币过程操作简单方便,三步即可完成?

  • 极客晨星实力撩姐,叶一茜大呼:我想给儿子报编程课!

    6 月 20 日晚上,明星辣妈&全能女神叶一茜淘宝直播带货,极力推荐极客晨星编程课。直播当晚,人气爆棚,引起家长共鸣,回响强烈,掀起了一波购课热潮。就连叶一茜也大呼:我想给儿子报编程课!极客晨星实力撩姐,它究竟有什么魅力呢?“早就想给我家儿子报名编程课了,没找到合适的机构,今天推荐一家在线少儿编程——极客晨星。”直播一开始,森蝶妈妈叶一茜就在直播间力推极客晨星。同时,她也谈到了作为一名家长的烦恼。“线下?

  • 张朝阳首次直播推荐亲测好物,少儿编程这个“知识点”亮了

    6 月 8 日晚 7 点,搜狐公司董事局主席兼CEO、搜狐视频CEO张朝阳将首次直播带货。届时,在搜狐视频APP“关注流”中搜索“张朝阳”,即可进入直播间看直播,秒杀亲选限量好物。“想带个货,顺便聊聊生活”。据了解,此次张朝阳在《Charles的好物分享》直播中推荐的物品,都是他生活中长期使用,觉得还不错的东西,同时也是个人的生活方式的一次展示。他强调这次直播带货是“抛砖引玉”,“希望未来带动更多名人来搜狐视频直播。”直

  • 编程猫CEO李天驰谈人工智能如何赋能教育

    【TechWeb】6月29日消息,编程猫创始人兼CEO李天驰受邀参加人民网联合全国高等学校计算机教育研究会举办的“共创智慧教育新生态”在线研讨会,就后疫情时代智慧教育建设分享了自己的观点。在谈及智慧教育如何落地、人工智能如何赋能教育方面,李天驰表示编程猫在普及人工智能教育以及编程教育上,发现在线教育在全国中小学落地,遇到的最大问题是缺少好的老师,为了解决在人工智能教育以及编程教育领域师资不匹配的问题,编程猫以

  • 抖音poi地址什么意思

    抖音门店POI地址是什么意思,在商家认领门店的时候会出现POI这样的提示字样,对于很多人来说POI这个词的具体意思还不清楚,这里我们来看下抖音POI地址的详细介绍。

  • 继Edge之后 谷歌将减少Chrome在Win10上的内存占用

    对于一款市占比超过60%份额的浏览器来说,谷歌仍然在不遗余力的优化Chrome,这确实是个好消息。据外媒报道称,Chrome程序员Bruce Dawson也在其公司的浏览器中添加了一个补丁,从而让Chrome可以

  • 内存新锐ZADAK首次转战SSD:性能、外观都没得挑

    ZADAK这个品牌大家可能还不太熟悉,此前专注于高性能内存,现在第一次转战SSD固态硬盘,而且出手不凡,首款产品“SPARK PCIe Gen 3x4 M.2 RGB SSD”从外观设计到规格性能都非常出色。

  • 紫光DDR4内存条揭秘:100%纯国产!

    最近,国产SSD固态盘、DDR4内存条纷纷出炉,内存方面既有来自紫光的,也有基于长鑫存储颗粒的光威弈Pro系列,而且价格也比较实惠,令人振奋。不过,紫光的内存条没有详细信息公开,尤其是不清

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议