声明:本文为个人练习写文章和做笔记用
视频链接【[C语言] 指针的详解与应用-理论结合实践,真正理解指针!】 https://www.bilibili.com/video/BV1Mb4y1X7dz/?share_source=copy_web&vd_source=90de1e9ed6b88504e2e9cdc237a80180
回顾
1.位和字节:
位 bit
位是计算机中最基本的信息单位,它可以表示二进制的0或1。一个位只能表示两种状态之一。
字节 byte
字节是计算机中常用的存储单位,它由8个连续的位组成。字节是计算机中最小的可寻址的存储单元,通常用于表示一个字符或其他小的数据单元。
1byte=8bits
2.计算机存储机制
4.大小端存储:
大端存储:大端存储模式下,数据的高字节(或称作高位、最重要字节)被存储在内存的低地址处,而数据的低字节(或称作低位、最不重要字节)存储在高地址处。
小端存储与之相反。
指针知识概要
1.指针变量定义
64位系统,指针占用8字节
2.指针操作
注:
1." * " 容易搞混
1: *P : 取数据 (对地址型变量操作 取内容)
2: int *P : 定义指针类型数据(关键在创建变量时使用 )
2.加减操作:
指针加减操作移动单位是 数据宽度
3.数组与指针
4.注意事项
在使用时可参考图中箭头指示方法。
指针应用
c应用-代码1(寻找数组中最大值)
//int FindMax( const int *array,int Count)//由于访问同一数组,防止子函数修改数组值时可加前缀const
int FindMax(int *array,int Count)
{
int i;
int max = array[0]; //最大值初值设为数组0位值
for(i = 0;i < Count;i ++)
{
if(array[i] > max)
max=array[i];
}
return max;
}
int Max = 0; //全局变量Max作取值储存
int main(void)
{
int a [5] = {1,2,3,5,7}; //这里定义个数组作查找示例
Max = FindMax(a,5); //取出最大值赋值给Max
return 0;
}
const:
const是C/C++中的一个关键字,用于修饰变量。当一个变量被const修饰,这个变量就被赋上了只读属性,该变量里的数据只能被访问。如果后续用户想要对其中的值直接进行修改,则编译器将会报错。
c应用-代码2(使用指针实现多返回值传参)
使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回。可实现多返回值函数的设计。
void FindMaxAndCount(int * max_1, int * count_1, const int *array,int length)
{
int i;
*count_1 = 1;
*max_1 = array[0]; //给两变量赋初值
for(i=0;i<length;i++)
{
if(array[i] > *max_1)
{
*max_1 = array[i];
*count_1=1;
}
else if(array[i] == *max_1)
(*count_1)++; //注意运算顺序,加括号
}
}
//!!!注意区分:Max与max_1(指针变量)
int main(void)
{
int a[5]={1,3,6,7,7};
int Max;
int Count;
FindMaxAndCount(&Max,&Count,a,5); //根据设定函数,输入对应变量类型,所以&
printf("Max = %d\n",Max);
printf("Count = %d\n",Count);
return 0;
}
c应用-代码3(通过指针访问封装中的数组)
//====================模拟封装===========
int time[]= {16,39,44}; // 定义一个整型数组并初始化
int* GetTime(void) //定义了一个名为 GetTime 的函数,并返回一个指向整型的指针(由int*指示)
{
return time;
/*返回指向数组的指针 在 GetTime 函数内部,使用 return 语句返回全局数组time的地址。由于数组名在表达式中会被转换为指向其首元素的指针,所以这里实际上是返回了指向数组第一个元素(即整数 16)的指针。
*/
}
//====================================
int main()
{
int *pt; // 定义一个整型指针变量 pt
pt = GetTime(); //调用 GetTime 函数,并将返回的指针(即全局数组 time 的首地址)赋值给
//pt。现在,pt 指向了全局数组 time 的第一个元素(即整数 16)。
}
c应用-代码4(指针传递数组)
unsigned char AirData[20]; //模拟接收数组
/*
函数 SendData 是一个用于数据复制的自定义函数
它接受两个参数:一个指向 const unsigned char类型的指针 data 和一个 unsigned char类型的 count
这个函数的目的是将 data 指针所指向的数组(或内存区域)中的前 count 个字节复制到全局数组 AirData 的对应位置
*/
void SendData(const unsigned char *data,unsigned char count) //数组传递函数
{ //定义指针型变量data
int i;
for(i=0;i<count;i++)
AirData[i]=data[i];
}
int main(void)
{
unsigned char a;
unsigned char dat[]={0x12,0x24,0x20,0x30}; //待传递数组
SendData(dat,4); //执行函数
for(a=0;a<20;a++)
printf("AirData[a]=%d\n",AirData[a]);
return 0;
}
c应用-代码5(指针传递复杂变量)
unsigned char arr[4]={0x00,0x00,0x00,0x00};
void SendData(const unsigned char *data,unsigned char count)
{
unsigned char i;
for(i=0;i<10;i++)
arr[i]=data[i];
}
int main()
{
float a = 12.345; //要传递的变量a
unsigned char *p; //定义 指针变量 p
p = (unsigned char*)&a; //将a的地址 强制转化为 c型指针 赋给p
SendData(p,4); //将 指针变量p 利用函数SendData传递给arr[]
float *b; //定义直接接收的 f指针b
b = (float*)arr; //将arr强制转化为 f型指针 赋给b
printf("\n b=%f",*b); //直接打印b (*b 取数据 )
return(0);
}
输出:
1f 85 45 41
b=12.345000