【C语言指针】江协科技视频总结知识点

声明:本文为个人练习写文章和做笔记用

视频链接【[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值