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轮:指针相关推荐

  1. quot c语言数组压缩 quot,程序员之---C语言细节12(指针和数组细节,quot;//quot;的可移植性说明)...

    主要内容:指针和数组细节,"//"的可移植性说明 #include int main(int argc, char **argv) { int a[10]={1,2,3,4,5,6 ...

  2. 已知小红今年12岁c语言编程,C语言程序设计第轮复习习题.doc

    C语言程序设计第轮复习习题 第1章 C语言概述.以下叙述正确的是 . A.在C程序中,main函数必须位于子程序的最前面 B.C程序的每一行中只能写一条语句 C.在对一个C程序进行编译的过程中,可发现 ...

  3. c语言函数名本质是指针,C语言的本质(12)——指针与函数

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...

  4. Go语言中时间轮的实现

    作者 | luozhiyun    责编 | 张文 来源 | https://www.luozhiyun.com/archives/444 最近在工作中有一个需求,简单来说就是在短时间内会创建上百万个 ...

  5. C语言高级篇 - 1.C语言复杂表达式和指针高级应用

    1.指针数组与数组指针 1.1.字面意思来理解指针数组与数组指针 (1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量. (2)数组指针的实质是一个指针,这个指针指向的是一个数组. 1. ...

  6. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 二、C语言里的函数指针...

    二.C语言里的函数指针 上一节里介绍了回调函数,模块A提供了该函数 然后模块A调用B B再返过来调用A提供的函数,再处理最后返回结果给A.晕了.还是画个图.一般调用情况: 图2-1 有回调函数的调用情 ...

  7. 一个C语言的基本教程—指针篇

    文章目录 9. C语言真正的灵魂--指针 (1). 指针到底是什么? (2). 指针的基本结构 (3). 取地址(&)和解引用(*)操作符 (4). 指针有什么用呢? #1.swap函数的例子 ...

  8. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  9. c语言如何用指针操作一维字符数组,C语言中数组和指针的互操作

    C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减.当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有 ...

最新文章

  1. vue从入门到进阶:Vuex状态管理(十)
  2. KeyMob:建立一个稳定的移动广告聚合平台!
  3. 验证手机号码的正则表达式
  4. 集中式整合之编写springsecurity配置类
  5. 使用 JavaScriptService 在.NET Core 里实现DES加密算法
  6. js 递归函数的使用及常用函数
  7. 微型计算机频繁死机的原因,电脑经常死机是什么原因|电脑经常死机的解决方法...
  8. python中的range与list函数
  9. 检测对象是否拥有某一属性
  10. MongoDB学习笔记—Linux下搭建MongoDB环境
  11. SOAP ,WSDL 和UDDI
  12. excel切片器_EXCEL制作高逼格动态图表神器,数据透视表之切片器技巧详解!
  13. 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY
  14. 【PPT】连续使用箭头等工具,避免多次重复选择,提升效率
  15. python画出分子化学空间分布(UMAP)
  16. 边境的悍匪—机器学习实战:第十三章 使用TensorFlow加载和预处理数据
  17. 被食者与食者系统matlab,捕食者与被捕食者模型——Logistic-Volterra
  18. java连接云服务Hadoop伪分布式错误:Call From LAPTOP-14BPR3NI/192.168.1.2 to node1:9000 failed on connection
  19. QQ群78928780记录整理:90514技术话题-部分
  20. 太阳照常升起(C大调)

热门文章

  1. 超生动图解LSTM和GPU:拯救循环神经网络的记忆障碍就靠它们了!
  2. 余凯:不做AI芯片,如何改变世界? | 变局者
  3. 视频出炉 | LeCun、Marcus激辩AI是否需要类似人类的认知能力
  4. 现实版高达!美日巨型机器人格斗大战结果即将见分晓
  5. JQuery使用deferreds串行多个ajax请求
  6. Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
  7. 基于腾讯云服务器部署微信小程序后台服务(Python+Django)
  8. 奇幻RPG(角色技能 与 Strategy模式)
  9. Lucene分词器,使用中文分词器,扩展词库,停用词
  10. Git 二分调试法,火速定位疑难Bug!