转自:http://blog.jobbole.com/86400/

介绍

1> 指针定义:指针是保存变量地址的变量。

2> 本文重点
>> 指针与数组之间的关系
>> 操纵指针的规则

3> 指针优点
>> 表达某个计算的唯一途径
>> 代码更高效,更紧凑

4> 指针缺点:难以理解,但是用好了,代码会非常清晰。

5> 将指针、数组和地址的算术运算集成在一起是C语言的一大优点。

指针与地址

1> 内存组织方式

(1) 内存是一个个单元组成的,每一个内存单元中存放一个字节(8位)的二进制信息。
(2) 机器中的内存单元是有序排列的。
(3) 机器给各个内存单元规定不同地址来管理内存。这样,CPU通过地址来识别不同的内存单元,正确的对内存单元进行操作。

<2> 指针与变量的关系(P:是指针变量,C:内存对象)

>>> P:保存C:中的单元首地址——这里的地址不是物理地址,而是经过地址映射后的虚拟地址,即逻辑地址。

>>> P:为指向C:的指针

3>理解指针

>>> 指针占用的内存空间大小: 32位系统占用4byte,64为8byte。

机器配置:

64位

打印指针大小:

#include <stdio.h>
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{int intvar = 1;printf("address of intvar = %p\n", (void *)(&intvar));printf("address of intvar - 1 = %p\n", (void *)(&intvar - 1));printf("address of intvar + 1 = %p\n", (void *)(&intvar + 1));int *p;char *pc;long int *pl;printf("int:%lu\nchar:%lu\nlong int:%lu\n", sizeof(p), sizeof(pc), sizeof(pl));return 0;
}

结果

address of intvar = 0x7fff50f19888
address of intvar - 1 = 0x7fff50f19884
address of intvar + 1 = 0x7fff50f1988c
int:8
char:8
long int:8

>>> 指针就是地址——我们可以把指针认为是用来存放地址的数据类型。不能把指针简简单单的当成一个整型数,虽然地址的值是一个整型数据。

>>> 指针是有类型的,但是这个类型不是给指针分配内存的,而是用来寻址的。

指针与函数参数

1.普通参数:C语言通过传值方式将值传递给被调用函数。

>> 会把变量的值复制一份给被调用函数。
>> 复制:会把变量的值赋值给一个新的变量(参数)——变量和新的变量必须有相同的存储容量。
>> 被调用函数并不能修改主调程序中的变量值,因为被调用函数使用的是一个复制过来的内存单元。

2.指针参数: 本质上跟普通参数传递是相同的,也进行了变量复制,但是传过去的值是地址。 被调用函数通过地址能够访问和修改主调程序中变量的值。

3.参数在内存消耗

普通参数:取决于申明类型。char:1个字节;short:2个字节;long:8个字节
指针参数:指针变量里存储的是地址(一般是4个字节——32位),永远是一个固定长度,不管是什么类型的指针。——除非处理器变化不是32位。

4.double *dp, atof(char *) 这里的dp是指针变量,而atof是函数

指针与数组

1.指针操作数组快于下标操作数组

2.数组的空间分配.如int a[10];——会在空间分配出40个相邻的内存单元来(10*4)。

3.指针操作数组

int *pa;
pa = &a[0];

4.指针移动

int *pa;
int a[10];
pa = &a[0];

pa+1将指向下一个元素a[1]:

>> 内存中的变化:”指针加1″会根据指针指定的类型int移动4个内存单元,其实本身并没有移动,只是pa+1等于第5个内存单元地址——“指针加1”中的1的大小是取决于pa的类型int的,指针类型决定指针跨内存单元的步长。

>> pa+1 等于是指向第5个内存单元——a[1]的第一个内存单元。

5.规则:

>> &a[i]和a+i含义相同,相互使用。a+i是a之后第i个元素地址。
>> 数组名代表数组第一个元素的地址。

地址运算符

1. 指针初始化:0或表示地址的表达式。

2. “指针加1”中的“1”的大小根据数据类型的长度按比例缩放。如果int类型占4个字节的存储空间,对应的1按4倍计算。

验证:

>>> 若指向char类型的指针p的内存地址是0×000000,那么p+1后的地址是0×000001。

验证过程如下:

运行结果:

>>> 若指向int 类型的指针p的内存地址是0×000000,那么p+1后的地址是0×000004。

运行结果:

3.指向不同数组的元素的指针之间的算术或比较运算都没有定义。

4.指针相减:如果p和q指向相同数组中的元素,且p<q,那么q-p+1就是p和q之间的元素(包括p和q)

代码验证:

运行结果:

流程变化:q-p=16 => 16/4=4 (按照int型所占内存单元等比例缩放) => 4 + 1 = 5;

总结

这次写关于c语言方面指针,是因为这两天看php内核文件的时候,由于C方面的欠缺,所以看着很吃力。所以想再复习下C语言。

为什么从指针入手呢?可能是因为指针在C语言中是比较难的。所以先把最难的啃下来。

本来是想一次性写完,可是指针这方面内容太多,所以决定分几批写。

我在C语言方面还是很薄弱,如果文章中有错误,希望高手们指点下。

参考文献:《C程序设计语言》

转载于:https://www.cnblogs.com/pengyingh/articles/5341053.html

C语言杂谈:指针与数组 (上) (转)相关推荐

  1. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. c语言常量l12和意义,课件c语言l12_指针和数组

    <课件c语言l12_指针和数组>由会员分享,可在线阅读,更多相关<课件c语言l12_指针和数组(42页珍藏版)>请在人人文库网上搜索. 1.计算机程序设计基础第12讲指针和数组 ...

  3. C语言 使用指针遍历数组 - C语言零基础入门教程

    目录 一.使用数组下标遍历数组 1.计算数组元素个数 2.通过下标遍历数组 二.使用数组首地址偏移遍历数组 三.使用指针遍历数组 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目 ...

  4. C语言杂谈——指针篇

    指针是C语言的难点,其原因是它拥有多重的含义.这给已熟练理解C语言指针精髓的程序员带来的好处是,可以天马行空的构建软件.但很不幸,我不是那些能够熟练理解并天马行空利用C指针的一员.对于我来说,是不是指 ...

  5. c语言指针数组 难点总结,C语言之指针与数组总结

    和指针相关的问题口诀1: 1. 地址变量得地址,得谁地址指向谁 和指针相关的问题要画图: 内容变量画房子,指针画箭头 ---->口 ------------------------------- ...

  6. C语言之指针与数组总结

    和指针相关的问题口诀1: 1. 地址变量得地址,得谁地址指向谁 和指针相关的问题要画图: 内容变量画房子,指针画箭头 ---->口 ------------------------------- ...

  7. 水滴石穿C语言之指针、数组和函数

    基本解释 1.指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址):数组的本质则是一系列的变量. 2.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容 ...

  8. C语言中指针与数组的区别,C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[ ...

  9. 国2c语言中指针与数组的赋值运算,C语言到汇编-指针与数组2

    本章剩下的内容主要有: 1.指针与数组 & 地址算术运算 2.字符指针与函数 3.多维数组 & 指针与多维数组 4.指向函数的指针 每个内容举一个例子,第一个例子: int a[10] ...

最新文章

  1. 创建Django项目和模型(创建工程、子应用、设置pycharm环境、使用Django进行数据库开发的步骤)
  2. numpy.random.uniform()
  3. TCP/IP详解学习笔记(7)-广播和多播,IGMP协议
  4. SQL基础【六、and与or】
  5. java打开输入框,java – 在Android中打开输入对话框
  6. 快速的利用 Express 框架实现一个 Rustfull 接口的后端 Server
  7. 计算营业额python_ARIMA时间序列分析-----Python实例(一周销售营业额预测)
  8. Markdown文档如何分页以及导出的PDF如何分页
  9. php正则表达式叹号,js库前加一个感叹号(!)是什么意思??
  10. python常用字符串_Python中最常用的字符串方法!
  11. 【深度讲解】手把手教你python制作萝莉音智能对话语音机器人,附全部源码!速速学起来!!
  12. java paypal 支付集成_java对接PayPal标准支付操作流程
  13. 计算机键盘打字基础知识,电脑打字入门基础知识
  14. 后门防御阅读笔记,Black-box Detection of Backdoor Attacks with Limited Information and Data
  15. 树莓派连接OLED屏
  16. 基于android的资讯阅读APP
  17. 关于“元宇宙”,讲点你能听懂的
  18. 基于Dragonboard 410c的PMIC简介
  19. 如何获取R语言中向量的元素
  20. Python 已知三角形的三条边,求面积

热门文章

  1. Foundation框架介绍
  2. Python selenium根据class定位页面元素,xpath定位
  3. Request对象 --web浏览器向web服务端的请求
  4. Oracle性能监控脚本
  5. 以编程方式进行NLog的配置【转】
  6. mac 下搭建 php + apache + mysql 服务器(cool)
  7. [置顶] JDK工具(零)--简要介绍JDK1.6自带的42个工具
  8. 代码审查就是在排大便——你懂的!
  9. Java 使用ZeroMQ 2.2 进行通信编程
  10. 解决修改css或js文件,浏览器缓存更新问题。