C语言之指针

Joymine 2020-01-12

C语言指针概述:
1.计算机系统中,无论是存入或是取出数据都需要与内存单元
打交道,物理器件通过地址编码寻找内存单元。
2.地址编码是一种数据,C语言的指针类型正是为了表示这种
计算机所特有的地址数据。
3.存取内存单元是任何程序经常性的操作,前面按对象(或变量)
名称直接访问内存单元。
4.程序运行时申请到的内存空间只有地址没有名称,因此指针
成为访问动态内存的唯一工具。

地址和指针的概念:
1.程序中的数据对象总是存放在内存中,在生命期内这些对象
占据一定的存储空间,有确定的存储位置。
2.C语言将内存单元抽象为对象,就可以按名称来使用对象。
3.定义数据对象时,需要说明对象名称和数据类型。
4.数据类型的作用是告诉编译器要为对象分配多大的存储空间(单位为字节),
以及对象中要存储什么类型的值。
5.对象名称的作用是对应分配到的内存单元,允许按名称来访问。

定义变量后,程序可以在变量中存储值和取出值。

C语言之指针

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

由于通过地址能寻找到对象的内存单元,因此C语言形象地把
地址称为”指针”,即一个对象的地址称为该对象的指针。

通过对象地址存取对象的方式称为指针间接访问。

C语言指针变量:

C语言将专门用来存放对象地址(即指针)的变量称为指针变量,
其数据类型为指针类型,定义形式:指针类型 *指针变量名,...

C语言之指针

通过指针变量,可以间接访问(或间接存取)对象。

区分指针和指针变量:
指针是地址值,指针变量是存储指针的变量,
例如可以说变量i的指针是4000,而不能说变量i的指针变量是4000;
可以说指针变量p的值是4000,p既可以存储变量i的指针,
又可以存储变量j的指针。

特殊的指针类型void*: 

C语言之指针

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

C语言之指针

取地址运算得到的指针不仅值为对象的地址,而且还以对象

的数据类型作为指向类型,例如:

C语言之指针

指针的间接访问:

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

C语言之指针

间接引用(又称解引用)运算符在所有运算符中优先级较高,

其运算结果是一个左值,即expr所指向 的对象或内存单元;
expr必须是指针的含义,可以为地址常量、指针变量、指针运算表达式。

C语言之指针

 指针变量的初始化与赋值:

取变量地址一定发生在该变量定义之后(这时才有地址) ,
否则是错误的。例如:

C语言之指针

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

C语言之指针

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

C语言之指针 

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

C语言之指针 

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

C语言之指针 

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

C语言之指针 

C语言之指针 

 C语言之指针 

3.两个指针相减运算:
设p1、p2是同一个指向类型的两个指针(常量或变量),
则p2-p1的结果为两个指针之间对象的个数,如果p2的地址值
大于p1结果为正,否则为负。 

指针的关系运算:
设p1、p2是同一个指向类型的两个指针(常量或变量),
则p2和p1可以进行关系运算,用于比较这两个地址的位置关系。

C语言之指针 

指针的类型转换:
设p是一个指针(常量、变量或表达式),可以对p进行显式类型转换,
一 般形式为:(转换类型* )p
对指针进行显式类型转换的结果是产生一个临时指针对象,
其指向类型为"转换类型",地址值与p的地址值相同,
但p的指向类型和地址值都不变。

指针的赋值运算:
指针可以进行赋值运算,前提是赋值运算符两边的操作数必须
是相同指向类型。例如:

C语言之指针

C语言之指针

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

C语言之指针

指针的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对象的指针变量是错误的。

C语言之指针 

 C语言之指针

 C语言之指针 

 C语言之指针 

如果指向const的指针所指的对象并非const,则可直接给该对象赋值
或间接地利用非const指针修改其值,毕竟这个值不是const的。重要的是要记住:
不能保证指向const的指针所指对象的值一定不被其他方式修改。 

const指针:
一个指针变量可以是只读的,称为const指针, 定义形式为:
指向类型 *const指针变量,.......;

C语言之指针 

 C语言之指针 

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

C语言之指针

相关推荐