1.什么是指针
计算机中所有的数据都必须存放在内存中,不同类型的数据占用的字节数不一样,
比如说 int 占4个字节,char 占 1个字节。为了能正确地访问到这些数据,必须为每个字节都编上号码,每个字节的编号是唯一的,根据编号可以准确的找到某个字节。将内存中每个字节的编号称为地址 或 指针。地址 从0开始依次增加,对于32位,程序能够使用的内存位4G
最小的地址为:0x0000 0000,最大的地址为 0xFFFF FFFF
C/C++中 *号运算符的意义;
2.定义指针变量
定义指针变量与定义普通变量非常类似,不过要在变量名前加 *
格式为:datatype *name ;或者datatype *name=&value;
*表示一个指针变量,datatype 表示该指针变量所指向的数据的类型
在指针定义中 *号和变量名结合
总结:指针就是内存的地址,指针变量,就是保存内存地址的变量
指针大小:32位,4字节
64位,8字节
3.使用指针变量 首先要明白 指针变量自身的值(存储的地址),再明确指针变量的所指的实体(解引用)
4.定义指针时,类型对指针变量起到了两个作用。
(1)解析存储单元的大小,即能访问几个字节
(2) 指针+1的能力
指针加+1会跳过指针类型能够访问的字节数 ,指针的类型不同,加1的能力不一样
5.指针的应用
(1)值传递
(2)指针传递
6.指针和数组的关系
数组名被看作该数组的第一个元素在内存中的首地址(仅在sizeof操作中例外,该操作给出数组所占的内存大小)。数组名在表达式中被自动转换为一个指向数组第一个元素的指针常量;
数组名是指针,使用非常方便,但却容易造成越界,编译器不会对数组的边界检测。
arr是数组第一个元素的地址,*arr就是数组的第一个元素arr[0] ,而arr+1是数组第二个元素的地址,
*(arr+1)就是第二个元素arr[1]本身。指针加1,则地址移动一个数组元素所占的字节数,因为arr
属于 int *类型的指针,数组名arr是指针但不是指针变量,他是地址常量,不占存储空间。
C语言的下标运算符[ ]是以指针为操作数的,arr[i]被编译系统解释为 *(arr+i),即表示为arr 所指元素向后的第i个元素。无论以下标方式或指针存取数组元素时,系统都是转换为指针方法实现的。
逻辑上有两种,但物理上只有一种。
总结:
(1).指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若干个位置。
(2).运算结果并不表明一定有一个指针所规定的数据的变量,即使是对数组操作。
指针的算数运算很容易超出数组的边界,需要小心越界的问题。