博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针总结与地址
阅读量:5902 次
发布时间:2019-06-19

本文共 1469 字,大约阅读时间需要 4 分钟。

指针是为了方便对地址直接操作而增加的一个中间操作符。

根据软件中间层的概念:

变量直接由高级操作;

地址直接由低级语言操作;

指针贯通高级语言与低级语言之间,是一个幽灵类型,直接对内存地址和内存地址中的数据双向操作。

 

最近在温故《C ++ primer》这本书,其中有一句话非常经典:

When attempting to understand pointer declarations, read them

from right to left.

 

为什么要有指针:

内存寻址的变种,是内存操作的接口;

方便数据在内存层面的组织;是数据结构的的核心支持;

是内存管理的有效工具;

提供了控制流跳转的开发层面支持。

 

变量:内存内容的标示;编程语言的直接操作对象;实质是操作内存对象;

存在于可执行文件的符号表中;在进程中没有存在,进程中只有内存数据。

 

指针的概念:(变量、类型、访问)

1)指针变量是一种特殊的变量;

2)指针变量作为变量,里面的数据是内存地址;

3)指针的类型决定了指针访问的内存大小;

4)指针内容语意:指针变量包含地址指向的内存单元的内容。

 

变量是与数据对应的概念。

指针变量是与内存地址对应的概念。

 

指针的本质是内存地址;变量的本质是内存数据。

 

指针可以无差别的访问进程的任何内存单元。

 

指针的操作:

指针的操作提供了内存的便捷访问方式(遍历、查询)。

 

指针的形式:

一、const指针

1、const int* p和int const* p:两者意义是相同的。指向的内容是只读数据,不可以q改变;但是指向的地址可以改变。
2、int* const p:必须先对指针初始化,而且指向的地址是只读的,不可以再被改变;但是指向的内容可以改变。
3、const int* const p:既不可以改变指针指向的地址,也不可以改变指针指向的内容。
 
二、指针数组:元素类型全是指针
类型名称*数组名[数组长度]
例如:
   char* pc[10]:字符指针数组,常用来可以表示一个字符串
 
三、数组指针:指针指向数组名
类型名称(*指针名)[数组长度]
例如:
   int a[5] = {1,2,3,4,5};
   int (*temp)[5] = &a; //temp指向的是整个数组
注意:
   1、定义指针时()不能丢掉,因为[]优先级比*高,若丢掉,就会变成指针数组。例如:int *temp[4]//数组4个元素都是int*。
   2、数组长度、元素类型必须与指针定义时给出的长度、类型相同。
 
四、函数指针
数据类型(*指针变量名称)(形式参数列表)
本质:函数放在代码区,函数指针指向代码区,通过函数指针可以访问代码区中的内容。括号()不可以省。。。
例如:float (*p)(float a,float y):float类型指针函数
     float* p(float x,float y):函数p返回值为float指针类型
 
五、总结数组与指针的区别:

1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。

2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常用指针来操作动态内存。
3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 

因为第三条,当把数组名作为函数的形参进行传递时,该效果等同于传递一个同类型的指针。直接在程序当中调用 函数名(数组名)即可。

转载地址:http://tikpx.baihongyu.com/

你可能感兴趣的文章
Bootstrap系列 -- 15. 下拉选择框select
查看>>
【转载】无限级分类的简单实例
查看>>
关于WinPE安装操作系统
查看>>
LeetCode Median of Two Sorted Arrays
查看>>
oschina程序开发
查看>>
mysql创建每月执行一次的event
查看>>
kafka集群部署
查看>>
STM8串口初始化寄存器配置
查看>>
ReactNative常用组件汇总
查看>>
openfaas 安装(docker swarm 模式)
查看>>
nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
查看>>
“正在注册字体”问题解决
查看>>
windows10 更新后要输入2次密码才能进入系统
查看>>
iOS开发-OpenGL ES入门教程1
查看>>
平衡二叉树(AVL树)
查看>>
面向对象思想(第一天)
查看>>
微信小程序 js逻辑
查看>>
linux 安装 sftp
查看>>
openStack queens
查看>>
C++中map用法详解《转》
查看>>