美文网首页程序员C/C++知识点C语言
C语言杂谈:指针与数组 (上)

C语言杂谈:指针与数组 (上)

作者: Python编程导师 | 来源:发表于2018-12-28 23:28 被阅读8次

思维导图

有兴趣一起交流学习c/c++的小伙伴可以加群:941 636 044

介绍

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

2> 本文重点

>> 指针与数组之间的关系

>> 操纵指针的规则

3> 指针优点

>> 表达某个计算的唯一途径

>> 代码更高效,更紧凑

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

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

指针与地址

1> 内存组织方式

 (1) 内存是一个个单元组成的,每一个内存单元中存放一个字节(8位)的二进制信息。

 (2) 机器中的内存单元是有序排列的。

 (3) 机器给各个内存单元规定不同地址来管理内存。这样,CPU通过地址来识别不同的内存单元,正确的对内存单元进行操作。

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

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

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

3>理解指针

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

机器配置:

打印指针大小:

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

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

指针与函数参数

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的内存地址是0x000000,那么p+1后的地址是0x000001。

验证过程如下:

运行结果:

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

运行结果:

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程序设计语言》

相关文章

  • C语言杂谈:指针与数组 (上)

    思维导图 介绍 1> 指针定义:指针是保存变量地址的变量。2> 本文重点>> 指针与数组之间的关系>> 操纵指针的...

  • C语言杂谈:指针与数组 (下)

    思维导图 介绍 前接上文C 杂谈之 指针与数组 (一),接续往下谈指针和数组。 指针与数组 ——承接上文进行扩展 ...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • C语言的指针与数组(进阶篇之一)

    一、一维数组与指针 (1).数组指针在C语言中,数组的首地址称为数组指针。而C++规定,数组的首地址可用数组名a表...

  • 指针与数组的区别和联系

    原文地址:指针与数组的区别和联系作者:zhenhuaqin 一.指针与数组的联系: 指针与数组是C语言中很重要的两...

  • 慕课网-Linux C语言指针与内存-学习笔记

    Linux C语言指针与内存 工具与原理 指针 数组 字符串 堆内存与栈内存 gdb内存调试工具。 C语言中指针的...

  • 浅谈C语言数组与指针的关系

    浅谈指针定义细节及其与数组的关系 前言 翁恺老师曾经说过,指针是 C 语言的灵魂,是使 C 语言成为 “C语言” ...

网友评论

    本文标题:C语言杂谈:指针与数组 (上)

    本文链接:https://www.haomeiwen.com/subject/rhaelqtx.html