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语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
随机推荐
- 洛谷P3957 跳房子 题解 二分答案/DP/RMQ
题目链接:https://www.luogu.org/problem/P3957 这道题目我用到了如下算法: 线段树求区间最大值: 二分答案: DP求每一次枚举答案g时是否能够找到 \(\ge k\) ...
- TP5单例模式操作Model
tp5单例模式的代码实现 为什么要使用单例模式 使用单例模式实现逻辑处理与数据库操作分离能很大提升mysql的sql处理能力,并且易于维护 ArticleModel.php <?php name ...
- Spring Boot JPA 懒加载
最近在使用spring jpa 的过程中经常遇到懒加载的错误:"` org.hibernate.LazyInitializationException: could not initiali ...
- java什么叫面向对象?
面向对象(Object-Oriented,简称OO)就是一种常见的程序结构设计方法. 面向对象思想的基础是将相关的数据和方法放在一起,组合成一种新的复合数据类型,然后使用新创建的复合数据类型作为项目的 ...
- react入门:todo应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python--day38--JoinableQueue解决生产者消费者模型
############################# # 在消费者这一端: #每次获取一个数据 #处理一个数据 #发送一个记号:标志一个数据被处理成功 #在生产者这一端: #每一次生成一个数据 ...
- CodeForces 242E "XOR on Segment"(线段树)
传送门 •题意 给你一个包含 n 个数的序列 a,定义序列上的两个操作: (1)$1,l,r\ :\ ans=\sum_{i=l}^{r}a_i$; (2)$2,l,r,x\ :\ \forall\ ...
- win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl
本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件. 在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl,实际上 ...
- MSBuild 常用参数
本文告诉大家在 MSBuild 里面常用的参数 一般的 msbuild 在编译的时候都会添加很多参数,用法如下 进入对应编译的 sln 或 csproj 文件所在的文件夹,执行下面命名 msbuild ...
- H3C查看文件内容
<H3C>more logfile.log 创建一个目录 <H3C>mkdir gaochengwang 重命名目录及文件 <H3C>rename wnt 0904 ...