1978年贝尔实验室正式发表C语言,受到众多IT从业者的热捧,即使41年过去了,C语言仍然牢牢占据最受欢迎编程语言前二的位置,许多人的程序开发之路也是从C语言开始的。
编程语言受欢迎排名
C语言简洁紧凑、灵活方便 ,相较于其它高级语言,直接操作地址是面向过程的C语言一大特点,也是C语言的精华所在。变量的实质是地址
内存是存放数据的空间,变量是在内存中申请的一段空间大小,不同类型的数据占用的字节数不一样。
变量申请
向内存申请了一个变量名为a的int型变量占4字节空间;向内存申请了一个变量名为b的short型变量占2字节空间;向内存申请了一个变量名为c的char型变量占1字节空间。
变量内容存储
使用取地址符&,查看变量a、b、c在内存的地址
变量在内存中的地址指针变量
数据存放在内存中都会有对应的地址,而这个地址就是指针。C语言中使用指针,可以使程序简洁、紧凑、高效;也可以有效地表示复杂的数据结构;实现动态分配内存。
普通变量和指针变量的区别就是,普通变量的值是可以直接使用的数据,而指针变量的值则存放的是其他变量的地址。指针变量的定义与普通变量定义是一致的,只是在数据类型后加运算符 “*”,比如:
int * p;
定义的p是一个指针变量,可以存放一个整形变量的地址。通过“*”获取p指向的对象内容,运算符 “*” 是间接寻址或者间接引用运算符。当它作用于指针时,将访问指针所指向的对象。
指针变量
变量p、变量a内存分布图
指针变量p指向变量a,p地址的内容是变量a的地址,a地址内容是数据30。
虽然64位系统里指针变量在内存中存放占用都是8个字节宽度,比如:
int * p, char * q; // 通过sizeof()查看都是8个字节
但还是要指定指针的类型,因为利用指针变量进行操作、运算时候,都涉及到指针变量指向的对象数据宽度。
除了通过指针获取内存数据外,还可以通过指针修改内存的内容:
通过指针修改对象值
下面通过程序看一下指针变量的赋值、运算:
指针变量运算
p是地址,p++地址累加,累加的步长正是指针向量的类型int(4个字节)。指向指针的指针
前面说过可以用指针指向普通变量,那么可不可以在用指针指向指针变量呢?答案是肯定的。
指向指针的指针
程序中指针的指针q指向的对象是指针变量p,指针变量p指向的对象是变量a。按照:&是取地址运算符,*是间接运算符(取的是指针对象),那么**q、*p、a是等价的,*q、p、&a是等价的、q、&p是等价的。
指针指示图
谨记一条原则:所有数据存放在内存都有地址,普通变量的值是数据,指针变量的值是地址,所以指向指针的指针的值还是地址,只是这个地址的值是另一个指针的地址。