目录
笔者在学习DMA实验时,发现对指针的理解和使用还是有些不足,本章将详尽地重新梳理一遍指针的知识和应用。
1. 指针的简介
指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将指针形象化的称为"C语言的灵魂"。由于指针和底层硬件紧密相连,所以使用指针可以实现数据的间接访问。
指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则指针指向了该数据单元
数据类型 | 数据大小(字节) | 指向该数据类型的指针 | 数据大小数据大小(字节) |
---|---|---|---|
(unsigned) char | 1 | (unsigned) char * | x |
(unsigned) short | 2 | (unsigned) short * | x |
(unsigned) int | 4 | (unsigned) int * | x |
(unsigned) long | 4 | (unsigned) long * | x |
float | 4 | float * | x |
double | 8 | double * | x |
注:16位系统:x = 2;32位系统:x = 4;64位系统:x = 8。
2. 指针的操作
定义:int a;
int *p;
操作方式 | 示例 | 说明 |
---|---|---|
取地址 | p = &a | a的首地址赋值给p |
取内容 | *p | 取指向的数据单元 |
加 | p++ | 指针向下移 |
减 | p-- | 指针向上移 |
注:指针和数据单元不可以跨类型传递,例如 a = p (×),a = *p (√),或者p = &a (√)。
3. 指针与数组
在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。数组的定义等效于申请内存、定义指针和初始化。
例: unsigned char array[]={...} //等效申请内存,且定义unsigned char *array = 0xXX
此时array[i] = *(array + i)。
4. 指针的应用
- 传递函数
- 传递返回值
- 直接访问物理地址下的数据
使用指针传递大容量参数,或者主函数和子函数利用同一个数据单元时,为了进一步提高运行效率,我们可以利用指针来减少内存的使用。例如:
int Find_MAX(const int *array){ ... }; //定义函数
int max = Find_MAX(a); //将数组整体发送到函数
使用指针输出参数,可以利用指针使得主函数和子函数用同一个数据单元地址的特性,通过修改某一地址的数组来达到多返回值的编辑。例如:
void Find_MAX( int *p ,const int *array) { //定义函数
*p = array[0]; //将数组第一个数据赋值到max的地址
int i;
for(i = 0; i < 3;i ++) {
if(array[i]>*p) *p = array[i]; } //比较大小
int main(){
int a[3] = {0x01,0xA2,0x1A}; //定义一个数组
int max;
Find_MAX(&max, a); //最大值通过操作max地址完成了传输
}
免责声明:本章资料来源于b站江科大,若有侵权请联系删除,谢谢。