C语言第12轮:指针
C语言第12轮:指针
【学习目标】
1. 指针
2. 指针与数组
A: 指针的概念
内存存储单元按字节排序。每一个字节编有序号。我们称之为地址。因为能够通过地址就能够找到所要的内存单元,所以我们把地址成为指针。指针是个特殊的变量,它里面存储的数值被解释为内存里的一个地址
作用:
(1) 指针能够有效地表示复杂数据结构,如队列、栈、链表等
(2) 指针能够像汇编一样处理内存地址,为动态内存分配提供支持
(3) 指针能够实现对数组和字符串的方便使用,提高程序的效率
B: 指针变量的定义
数据类型 * 指针变量;
如:
int*p2; /*p2是指向int型的指针变量*/float*p3; /*p3是指向float型的指针变量*/char*p4; /*p4是指向char型的指针变量*/
说明:数据类型并非指变量本身的类型,而是该变量所指向目标变量的类型。指针变量仅仅能指向同类型的变量。
//指针的定义
#include <stdio.h>int main( void )
{//野指针:不是NULL指针,是向被释放的或者訪垃圾内存的指针int *ptr1; //ptr1为int型指针,野指针,里面为垃圾地址char *ptr2; //ptr2为char型指针,野指针,里面为垃圾地址 //在VC中编译,会提示ptr1和ptr2没有初始化float*ptr3= NULL; //ptr3为float型指针,不是野指针,已经初始化为NULL//查看地址printf("( ptr1 )= %p\n", ptr1 );printf("( ptr2 )= %p\n", ptr2 );printf("( ptr3 )= %p\n", ptr3 );return 0;
}
C: 指针的赋值(注意:类型要匹配)
(a)使用地址运算符&:
如:
int a =133;
int * p1;
p1= & a; //使用地址运算符把a的值赋值给指针p1
(b)将一个已具有指向的指针变量赋值给还有一个指针变量
如(接上面的):
int* p2;
p2=p1; //p1和p2同一时候指向变量a
(c) 指针与数组的赋值
int a[5],*pa;pa=a; //(数组名表示数组的首地址,故可赋予指向数组的指针变量pa)//也可写为:pa=&a[0]; //数组第一个元素的地址也是整个数组的首地址, //当然也可採取初始化赋值的方法:int a[5];int *pa=a;
(d) 字符串与指针的赋值。
比如:
char *pc;pc="C Language"; //或用初始化赋值:char *pc="C Language";
PS: 不同意把一个数直接赋予指针变量。
如:
int *p;p=1000; //类型不匹配。提示错误//改进方式P= ( int * )100; //强制类型转换。
D: & 和 * 的使用
(a) 合法的使用取地址符能够得到一个变量的地址
如:
int a;int score[5]= {80, 90, 97, 98, 63};&a,&score[0]; //该操作合法&(a+5); // 该操作非法,越界&a=123; //该操作非法,须要的话必须的强制转换&score; //该操作非法,score本身代表score的首地址
(b)使用* 运算符,间接存取指针所指向的目标标变量的值(类型要匹配)
itn a = 234;
int * p1;
p1=& a; //p1指向数组a
printf(“%d\n”, *p ); //符号*是把地址中的内容取出。
E: 指针与整数相加减
意义:表示指针的移动
如: p+n p-n p++ p-- ++p --p
PS:
(1) 当中的n为整数。地址的移动不能为小数。
(2) 加法表示指针p向地址增大的方向移动。
(3) 减法表示指针p向地址减小的方向移动
(4) 至于移动的长度,是由计算机决定。
如:设p是指向type(类型)类型的指针。n为整型表达式,则p+(或—)n为一个新的地址。其值为p+(或-)n*sizeof(type)。
F: 指针与数组
因为数组中的各元素的存储单元是连续分配的。因此能够用指针来訪问数组,数组名就是该数字的首个地址。
如: int a[]=“abcdefg”;
a 就是该数组的首地址。等价于&a[0]
PS: 通过收地址,能够非常快的、方便的訪问数组中的其它元素。方法例如以下:
首地址+ 偏移量
a[ i ]能够转化为: *(a+i), *(&a[0]+i)
指针与数组的比較 |
|
指针 |
数组 |
保存数据的地址,不论什么存入指针变量的数据都会被当做地址来处理。 |
保存数据。数组名为数组首元素的首地址。 |
间接訪问数据。通过获取指针变量中的内容(地址),然后从这个地址提取数据。 指针能够使用指针形式訪问数据,也能够使用下标形式訪问数据。 |
直接訪问数据。能够通过指针的形式訪问数据,也能够使用下标訪问数据。 |
通经常使用于动态数据结构 |
通经常使用于存储固定数目 |
使用malloc,calloc,recalloc和free函数分配内存 |
不能删除分配的内存,能够删除数据 |
【指尖的微笑】错误在所难免。希望得到大家的指正^-^
转载时保留原文的链接(http://it.bangedushuren.cn/)原创,转载请注明
版权声明:本文皆有[www.bangedushuren.cn]原版的,转载请注明http://dh.51zhui.cn/,谢谢
C语言第12轮:指针相关推荐
- quot c语言数组压缩 quot,程序员之---C语言细节12(指针和数组细节,quot;//quot;的可移植性说明)...
主要内容:指针和数组细节,"//"的可移植性说明 #include int main(int argc, char **argv) { int a[10]={1,2,3,4,5,6 ...
- 已知小红今年12岁c语言编程,C语言程序设计第轮复习习题.doc
C语言程序设计第轮复习习题 第1章 C语言概述.以下叙述正确的是 . A.在C程序中,main函数必须位于子程序的最前面 B.C程序的每一行中只能写一条语句 C.在对一个C程序进行编译的过程中,可发现 ...
- c语言函数名本质是指针,C语言的本质(12)——指针与函数
往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...
- Go语言中时间轮的实现
作者 | luozhiyun 责编 | 张文 来源 | https://www.luozhiyun.com/archives/444 最近在工作中有一个需求,简单来说就是在短时间内会创建上百万个 ...
- C语言高级篇 - 1.C语言复杂表达式和指针高级应用
1.指针数组与数组指针 1.1.字面意思来理解指针数组与数组指针 (1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量. (2)数组指针的实质是一个指针,这个指针指向的是一个数组. 1. ...
- 木老师教笨笨课堂——系列讲座(从函数指针到委托) 二、C语言里的函数指针...
二.C语言里的函数指针 上一节里介绍了回调函数,模块A提供了该函数 然后模块A调用B B再返过来调用A提供的函数,再处理最后返回结果给A.晕了.还是画个图.一般调用情况: 图2-1 有回调函数的调用情 ...
- 一个C语言的基本教程—指针篇
文章目录 9. C语言真正的灵魂--指针 (1). 指针到底是什么? (2). 指针的基本结构 (3). 取地址(&)和解引用(*)操作符 (4). 指针有什么用呢? #1.swap函数的例子 ...
- C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)
文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...
- c语言如何用指针操作一维字符数组,C语言中数组和指针的互操作
C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减.当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有 ...
最新文章
- vue从入门到进阶:Vuex状态管理(十)
- KeyMob:建立一个稳定的移动广告聚合平台!
- 验证手机号码的正则表达式
- 集中式整合之编写springsecurity配置类
- 使用 JavaScriptService 在.NET Core 里实现DES加密算法
- js 递归函数的使用及常用函数
- 微型计算机频繁死机的原因,电脑经常死机是什么原因|电脑经常死机的解决方法...
- python中的range与list函数
- 检测对象是否拥有某一属性
- MongoDB学习笔记—Linux下搭建MongoDB环境
- SOAP ,WSDL 和UDDI
- excel切片器_EXCEL制作高逼格动态图表神器,数据透视表之切片器技巧详解!
- 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY
- 【PPT】连续使用箭头等工具,避免多次重复选择,提升效率
- python画出分子化学空间分布(UMAP)
- 边境的悍匪—机器学习实战:第十三章 使用TensorFlow加载和预处理数据
- 被食者与食者系统matlab,捕食者与被捕食者模型——Logistic-Volterra
- java连接云服务Hadoop伪分布式错误:Call From LAPTOP-14BPR3NI/192.168.1.2 to node1:9000 failed on connection
- QQ群78928780记录整理:90514技术话题-部分
- 太阳照常升起(C大调)
热门文章
- 超生动图解LSTM和GPU:拯救循环神经网络的记忆障碍就靠它们了!
- 余凯:不做AI芯片,如何改变世界? | 变局者
- 视频出炉 | LeCun、Marcus激辩AI是否需要类似人类的认知能力
- 现实版高达!美日巨型机器人格斗大战结果即将见分晓
- JQuery使用deferreds串行多个ajax请求
- Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
- 基于腾讯云服务器部署微信小程序后台服务(Python+Django)
- 奇幻RPG(角色技能 与 Strategy模式)
- Lucene分词器,使用中文分词器,扩展词库,停用词
- Git 二分调试法,火速定位疑难Bug!