C语言杂谈:指针与数组 (上) (转)
转自:http://blog.jobbole.com/86400/
介绍
1> 指针定义:指针是保存变量地址的变量。
2> 本文重点
>> 指针与数组之间的关系
>> 操纵指针的规则
3> 指针优点
>> 表达某个计算的唯一途径
>> 代码更高效,更紧凑
4> 指针缺点:难以理解,但是用好了,代码会非常清晰。
5> 将指针、数组和地址的算术运算集成在一起是C语言的一大优点。
指针与地址
1> 内存组织方式
>>> 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语言杂谈:指针与数组 (上) (转)相关推荐
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- c语言常量l12和意义,课件c语言l12_指针和数组
<课件c语言l12_指针和数组>由会员分享,可在线阅读,更多相关<课件c语言l12_指针和数组(42页珍藏版)>请在人人文库网上搜索. 1.计算机程序设计基础第12讲指针和数组 ...
- C语言 使用指针遍历数组 - C语言零基础入门教程
目录 一.使用数组下标遍历数组 1.计算数组元素个数 2.通过下标遍历数组 二.使用数组首地址偏移遍历数组 三.使用指针遍历数组 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目 ...
- C语言杂谈——指针篇
指针是C语言的难点,其原因是它拥有多重的含义.这给已熟练理解C语言指针精髓的程序员带来的好处是,可以天马行空的构建软件.但很不幸,我不是那些能够熟练理解并天马行空利用C指针的一员.对于我来说,是不是指 ...
- c语言指针数组 难点总结,C语言之指针与数组总结
和指针相关的问题口诀1: 1. 地址变量得地址,得谁地址指向谁 和指针相关的问题要画图: 内容变量画房子,指针画箭头 ---->口 ------------------------------- ...
- C语言之指针与数组总结
和指针相关的问题口诀1: 1. 地址变量得地址,得谁地址指向谁 和指针相关的问题要画图: 内容变量画房子,指针画箭头 ---->口 ------------------------------- ...
- 水滴石穿C语言之指针、数组和函数
基本解释 1.指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址):数组的本质则是一系列的变量. 2.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容 ...
- C语言中指针与数组的区别,C语言 指针与数组的详解及区别
C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[ ...
- 国2c语言中指针与数组的赋值运算,C语言到汇编-指针与数组2
本章剩下的内容主要有: 1.指针与数组 & 地址算术运算 2.字符指针与函数 3.多维数组 & 指针与多维数组 4.指向函数的指针 每个内容举一个例子,第一个例子: int a[10] ...
最新文章
- 创建Django项目和模型(创建工程、子应用、设置pycharm环境、使用Django进行数据库开发的步骤)
- numpy.random.uniform()
- TCP/IP详解学习笔记(7)-广播和多播,IGMP协议
- SQL基础【六、and与or】
- java打开输入框,java – 在Android中打开输入对话框
- 快速的利用 Express 框架实现一个 Rustfull 接口的后端 Server
- 计算营业额python_ARIMA时间序列分析-----Python实例(一周销售营业额预测)
- Markdown文档如何分页以及导出的PDF如何分页
- php正则表达式叹号,js库前加一个感叹号(!)是什么意思??
- python常用字符串_Python中最常用的字符串方法!
- 【深度讲解】手把手教你python制作萝莉音智能对话语音机器人,附全部源码!速速学起来!!
- java paypal 支付集成_java对接PayPal标准支付操作流程
- 计算机键盘打字基础知识,电脑打字入门基础知识
- 后门防御阅读笔记,Black-box Detection of Backdoor Attacks with Limited Information and Data
- 树莓派连接OLED屏
- 基于android的资讯阅读APP
- 关于“元宇宙”,讲点你能听懂的
- 基于Dragonboard 410c的PMIC简介
- 如何获取R语言中向量的元素
- Python 已知三角形的三条边,求面积