C语言指针
第一次写博客,如果写的不好请大佬们帮我更正
最近学校实训,我选的嵌入式,老师今天浅提了指针,我复习了一遍,看了b站江科大的视频。
https://www.bilibili.com/video/BV1Mb4y1X7dz/?spm_id_from=333.337.search-card.all.click&vd_source=a455dbf91615f50295fdf2098b9f2f00
指针简介
- 指针是C语言的一个重要知识点,其使用灵活、功能强大,是C语言的灵魂;
- 指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问。
存储机制
如果是一个基本数据类型(int, float, double, char, bool, 枚举)数据存储分为:
小端存储:如下图
大端存储 :与小端存储相反
如果是数值,结构体这种:数值/结构体中的每个变量按顺序存储,每个变量按照基本数据类型存储。
定义指针
指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元,若指针存放的值是0,则这个指针为空指针
k位系统:x = k / 8 ====》 字节 = 系统位数 除以 8bit
指针的操作
这里的++,-- 操作,每次都是加上/减去对应的数据类型所占的宽度
int num = 10;
int *p = #
// 输出值 *取值运算符
cout << num << endl;
cout << *p << endl;
// 输出地址 &取址运算符
cout << &num << endl;
cout << p << endl;
cout << p + 1 << endl;
显示结果:
地址分析:
数组与指针
二者本质上是一样的
注意事项
指针的应用
第一种情况(节省空间):
void getMax(int *a, int length)
{
int max = a[0];
for(int i = 1; i < length; i++)
if(max < a[i])
max = a[i];
cout << max << endl;
}
// main函数里的部分代码
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int length = 10;
getMax(arr, length);
地址分析:节省了32B
第二种情况(多个返回值):
void getMax(int *a, int length, int *max, int *min)
{
*max = a[0], *min = a[9];
for(int i = 0; i < length; i++)
{
if(*max < a[i])
*max = a[i];
if(*min > a[i])
*min = a[i];
}
}
// main函数部分代码
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int length = 10;
int max;
int min;
getMax(arr, length, &max, &min);
cout << max << " " << min << endl;
地址分析(只看max,min):
第三种(模块句柄):
这主要由c和c++本身的库组成
eg: strcpy(*const char c1, *const char c2)————》里面的参数是两个常量字符串指针,将c2复制到c1上,c2值和地址不变,c1的值改变,地址不变(这部分理解不是很清楚,有机会再补)
第4种:单片机还在路上,回头学完51再补……