1 指针的概念:
指针的全称:指针变量(相对应的有指针常量。),是一个变量,该变量可以用来保存一个数据。保存的数据是一个十六进制的地址,给一个指针进行赋值操作的时候,称为 “指向”。
2、定义及声明:
①一个完整的指针定义方式:
变量类型+“*”+变量名
②指针变量的大小:
一个指针在32位系统中,占4个字节大小,在64位系统中,占8个字节大小 。
3、指针的取值操作:*
对一个地址进行取取操作,就会直接取到该地址空间上的值。
同理,对一个指向一片地址空间的指针进行取操作,同样会取到那片地址空间上的值。
使用指针是特别注意,一个指针指向的数据是哪一个数据,以及一个指针取*后是哪一个数据。
4、指针变量的类型:
所有数据类型,都可以变成该数据类型的指针。
int *
代表int类型的指针char*
代表char类型的指针int **
代表int*类型的指针void *
代表通用指针
通用指针可以作为左值接受任何类型的指针数据。但是通用指针有一个缺点:它不可以直接取值。通用指针保存的数据,系统并不会知道这个数据具体是什么数据类型,所以带该地址进行取操作的话,系统不知道需要分配多少缓存空间。所以,在对void通用指针进行取*之间,需要对该通用指针明确数据类型。
对一个通用指针明确数据类型:强制类型转换。
void*
不代表空指针,而代表通用指针,将指针设置为空指针应用NULL
来代表,或者用0。
5、指针与函数的关系:
①函数参数使用指针传参的形式:将地址传给函数内部,函数外部与函数内部变量同步发生改变。
但是依旧会发生实参给形参赋值的操作:这个操作代表了形参保存了实参的值,由于实参是一个变量的地址 ,所以形参实际上保存的就是该变量的地址。所以在函数内部对该地址进行改变的地里,实参也在改变。
②函数名本身也是一个指针,它不能作为左值,只能作为右值。
函数指针可以用来接受一个函数名,接受之后,调用这个指针,就相当于在调用该函数。
函数指针声明方式:指向函数的返回值类型+指针变量+(指向的函数的参数列表的具体格式);
6、指针与数组的关系:
数组名本身就是一个指针,但是需要注意的是,数组名这个指针不能作为左值去指向其它地方,它只能作为右值给其它指针赋值。数组名这个指针是一个常量。
指针的偏移:
通过对已知的指针进行+或-操作,来实现访问到与已知指针相关的其它内存空间。
指针偏移的量(即一个指针+1后,地址增加的绝对值):它根据数据类型的大小模块化偏移。
数组名指向数组首元素的地址。
一个用来存放指针的数组,称为指针数组。那么一个用来指向数组的指针,就称为数组指针。我们严格意义上说的数组指针,它是一个指向二维数组的指针。
指针小结:
二维数组和指针数组的区别:
- 指针是一个变量, 它存储另一个对象的内地址。
- 指针的声明由基本类型、 星号 (*)和变量名组成。
- 为指针赋值, 赋值运算符右侧必须是一个地址。如果是普通变量,则需要在前面加一个取地址运行符&;如果是另一个指针变量或者是一个数组,不需要加&运算符。
- 运算符 *用于返回指针向的内存地址中储值。
- 指针算术运算的含义是指针的移动, 将指针执行加上或者减去一个整数值n的运算相当于指针向前或向后移动n个数据单元。
- 指针可以执行比较相等的运算, 用来判断两个指针是否指向同一变量。
- 指向数组的针, 存储的是数组中元素地址。 数组 data的第 (i+1)个元素的地址可表示为
&data[i]
或(data+i)
。 - 对于
regitser
(寄存器)类型的变量,不能进行取地址(&)的操作。