C语言之指针用法总结
C语言指针概述:
1.计算机系统中,无论是存入或是取出数据都需要与内存单元
打交道,物理器件通过地址编码寻找内存单元。
2.地址编码是一种数据,C语言的指针类型正是为了表示这种
计算机所特有的地址数据。
3.存取内存单元是任何程序经常性的操作,前面按对象(或变量)
名称直接访问内存单元。
4.程序运行时申请到的内存空间只有地址没有名称,因此指针
成为访问动态内存的唯一工具。
地址和指针的概念:
1.程序中的数据对象总是存放在内存中,在生命期内这些对象
占据一定的存储空间,有确定的存储位置。
2.C语言将内存单元抽象为对象,就可以按名称来使用对象。
3.定义数据对象时,需要说明对象名称和数据类型。
4.数据类型的作用是告诉编译器要为对象分配多大的存储空间(单位为字节),
以及对象中要存储什么类型的值。
5.对象名称的作用是对应分配到的内存单元,允许按名称来访问。
定义变量后,程序可以在变量中存储值和取出值。

1.数据值100存储到i对应的内存单元,表达式i+ 100的值
存储到j对应的内存单元。
2.按对象名称存取对象的方式称为对象直接访问。
3.在容量可观的存储空间中,计算机硬件实际上是通过地址编
码而非名称来寻找内存单元的。
4.地址编码通常按无符号整型数据处理(没有负数),每个内
存单元都有一个地址,以字节为单位连续编码。
5.编译器将程序中的对象名转换成机器指令能识别的地址,
通过地址来存取对象值。
由于通过地址能寻找到对象的内存单元,因此C语言形象地把
地址称为”指针”,即一个对象的地址称为该对象的指针。
通过对象地址存取对象的方式称为指针间接访问。
C语言指针变量:
C语言将专门用来存放对象地址(即指针)的变量称为指针变量,
其数据类型为指针类型,定义形式:指针类型 *指针变量名,...

通过指针变量,可以间接访问(或间接存取)对象。
区分指针和指针变量:
指针是地址值,指针变量是存储指针的变量,
例如可以说变量i的指针是4000,而不能说变量i的指针变量是4000;
可以说指针变量p的值是4000,p既可以存储变量i的指针,
又可以存储变量j的指针。
特殊的指针类型void*:

获取对象的地址:通过取地址运算(&)获取对象的地址。

取地址运算得到的指针不仅值为对象的地址,而且还以对象
的数据类型作为指向类型,例如:

指针的间接访问:
通过间接引用运算(*)可以访问指针所指向的对象或内存单元。

间接引用(又称解引用)运算符在所有运算符中优先级较高,
其运算结果是一个左值,即expr所指向 的对象或内存单元;
expr必须是指针的含义,可以为地址常量、指针变量、指针运算表达式。

指针变量的初始化与赋值:
取变量地址一定发生在该变量定义之后(这时才有地址) ,
否则是错误的。例如:

指针变量初始化时,地址初值必须是与指针变量同一指向类型
的地址值,例如:

指针变量可以进行赋值运算:

指针变量赋值时要求左值和右值必须是相同的指向类型,
C语言不会对不同指向类型的指针作隐式类型转换。例如:

指针的算术运算:
包括指针加减整数运算,指针变量自增自减运算,两个指针相减运算。
1.指针加减整数运算:
设p是一个指针(常量或变量),n是一个整型(常量或变量),
则p+n的结果是一个指针,指向p所指向对象的后面的第n个对象;
而p-n的结果是一个指针,指向p所指向对象的前面的第n个对象。

2.指针变量自增自减运算:
设p是一个指针变量,其自增自减运算包括p++、 ++p、p--、--p形式。



3.两个指针相减运算:
设p1、p2是同一个指向类型的两个指针(常量或变量),
则p2-p1的结果为两个指针之间对象的个数,如果p2的地址值
大于p1结果为正,否则为负。
指针的关系运算:
设p1、p2是同一个指向类型的两个指针(常量或变量),
则p2和p1可以进行关系运算,用于比较这两个地址的位置关系。

指针的类型转换:
设p是一个指针(常量、变量或表达式),可以对p进行显式类型转换,
一 般形式为:(转换类型* )p
对指针进行显式类型转换的结果是产生一个临时指针对象,
其指向类型为"转换类型",地址值与p的地址值相同,
但p的指向类型和地址值都不变。
指针的赋值运算:
指针可以进行赋值运算,前提是赋值运算符两边的操作数必须
是相同指向类型。例如:


void*指针可以做关系运算,表示两个指针的地址值比较。
void*指针可以指向其他任何类型,无需类型转换。
假定指针是有效的,可以将void* 指针显式类型转换为其他类型,
再使用间接引用。例如:

指针的const限定:
const限定符作用在指针类型有两种含义:
指向const对象的指针和const指针。
1.指向const对象的指针:
一个指针变量可以指向只读型对象,称为指向const对象的指针,
定义形式为:const 指向类型 *指针变量,.......;
即在指针变量定义前加const限定符,其含义是指针指向的对象是只读的,
即不允许通过指针来改变所指向的const对象的值。
例如const int *p;
这里p是一个指向const的int类型对象的指针,const限定
p指针所指向的对象类型,而并非p本身。
也就是说,p本身并不是只读的,在定义时不需要对它进行初始化。
可以给p重新赋值,使其指向另一个const对象。
但不能通过p修改其所指对象的值。
把一个const对象的地址赋给一个非const对象的指针变量是错误的。




如果指向const的指针所指的对象并非const,则可直接给该对象赋值
或间接地利用非const指针修改其值,毕竟这个值不是const的。重要的是要记住:
不能保证指向const的指针所指对象的值一定不被其他方式修改。
const指针:
一个指针变量可以是只读的,称为const指针, 定义形式为:
指向类型 *const指针变量,.......;


指向const对象的const指针:
可以定义指向const对象的const指针,形式为:
const 指向类型 * const 指针变量,......

C语言之指针用法总结的更多相关文章
- C语言的指针用法:输入一堆字符,把非字母的删去。
char *p,a[20]; int i; gets(a); //这个语句不同于getchar(),后者只能一次输入一个,而前者可以一次输完所有的字符!!! p=a; //这个语句 ...
- C语言函数指针用法
#include <stdio.h> #include <string.h> static void sayHello(); static void salute(); voi ...
- 编程基础-c语言中指针、sizeof用法总结
1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- C语言二重指针与malloc
(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- go语言的指针类型
一.指针与引用的相关概念 什么是指针? 指针,全称为指针变量,是用来存储内存地址的一种变量.程序中,一般通过指针来访问其指向的内存地址中的内容(数据). 什么是引用? 引用,是C++中提出来的一种新的 ...
- 浅谈c语言的指针
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
随机推荐
- Error: Cannot find module 'webpack/bin/config-yargs' 报错原因, webpack@4.X踩的坑~
1 .使用webpack@4.32.2时, 当我通过package.json的script去执行webpack-dev-server时, 报以下错误: Error: Cannot find modu ...
- 2019-8-31-dotnet-core-黑科技·String.IndexOf-性能
title author date CreateTime categories dotnet core 黑科技·String.IndexOf 性能 lindexi 2019-08-31 16:55:5 ...
- Flex AIR使用ADT命令打包 ipa
1. 配置环境变量. 2. 测试adt命令 3. 将ShepherdPhone0815.mobileprovision和 my.p12文件都放入编译好的工程目录下,如下图: 4.切换到上述编译好的目录 ...
- [转载] linux、Solaris下xdmcp远程桌面服务
原文链接 http://youlvconglin.blog.163.com/blog/static/52320420106243857254/ 使用图形界面远程登录linux和Solaris,首先要在 ...
- servicemix-4.5.3 启动日志
karaf@root> log:display 2015-01-12 10:48:03,950 | WARN | rint Extender: 3 | XBeanNamespaceHandle ...
- jekyll 添加 Valine 评论
本文告诉大家如何在自己搭建的静态博客添加 Valine 评论.在这前,我基本都是使用 多说,但是多说gg啦,所以就在找一个可以替换的评论 本来 Disqus是很好的,但是在国内很难打开,所以我就需要一 ...
- 2018-8-10-win10-uwp-MVVM-语义耦合
title author date CreateTime categories win10 uwp MVVM 语义耦合 lindexi 2018-08-10 19:16:53 +0800 2018-2 ...
- 圆角效果 border-radius——阴影 box-shadow——为边框应用图片 border-image
1.圆角效果 border-radius border-radius: 5px 4px 3px 2px; /* 四个半径值分别是左上角.右上角.右下角和左下角,顺时针 */ 不要以为border-ra ...
- Comb CodeForces - 46E (动态规划)
题面 Having endured all the hardships, Lara Croft finally found herself in a room with treasures. To h ...
- Linux中找不到ifconfig命令的解决方法
1.ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行i ...