day03 指针应用和文件操作

C语言指针的详解与应用

image-20251207220301446

image-20251207220342286

image-20251207220914448

image-20251207221029122

指针存放的是首地址,指针是变量

image-20251207221957007

image-20251207222010710

image-20251207222050141

image-20251207222607913

image-20251207222618954

关于指针 p++ 的操作

image-20251207222903249

#include <stdio.h>
int main()
{
    char a = 0x66;
    char *p;  // 星号通常和变量名放在一起,防止歧义

    p = &a;   // 把a的地址给p

    printf("%x\n",a);   // a的值
    printf("%x\n",p);   // a的地址
    printf("%x\n",*p);  // 通过a的地址访问数据

    p++;

    printf("%x\n",p);  // 加上1字节,因为是char占1字节
    
    return 0;
}

image-20251207223055230

#include <stdio.h>
int main()
{
    char a[] = {0x33,0x34,0x35};

    // 正常访问
    printf("a[0] = %x\n",a[0]);
    printf("a[1] = %x\n",a[1]);
    printf("a[2] = %x\n",a[2]);

    // 使用指针访问数组
    printf("*a = %x\n",*a);
    printf("*(a + 1) = %x\n",*(a + 1));
    printf("*(a + 2) = %x\n",*(a + 2));

    return 0;

}

image-20251207223906650

#include <stdio.h>
#include <stdlib.h>
int main()
{
    // char a[] = {0x33,0x34,0x35};
    // 动态申请内存,效果一样
    int *a;
    a = malloc(3*4);
    *a = 0x33;
    *(a + 1) = 0x34;
    *(a + 2) = 0x35;

    // 正常访问
    printf("a[0] = %x\n",a[0]);
    printf("a[1] = %x\n",a[1]);
    printf("a[2] = %x\n",a[2]);

    // 使用指针访问数组
    printf("*a = %x\n",*a);
    printf("*(a + 1) = %x\n",*(a + 1));
    printf("*(a + 2) = %x\n",*(a + 2));

    return 0;

}

image-20251207224252347

image-20251207224424873

image-20251207224811062

#include <stdio.h>

void fun(int param)
{
    printf("%x\n",param);
}

int main()
{
    int a = 0x66;

    fun(a); // 值传递本质是复制,两份数据存储在不同的位置

    return 0;
}

image-20251207225243541

#include <stdio.h>

int FindMax(const int *array,int Count)  // const 常量、只读
{
    int i;
    int max = array[0];
    for ( i = 0; i < Count; i++)
    {
        if (array[i] > max)
        {
            max = array[i];
        }    
    }
   return max; 
}

int main()
{
    int a[] = {1,2,30,5,4,3};
    int Max;

    Max = FindMax(a,6);

    printf("Max = %d\n",Max);

    return 0;
}

image-20251207230018898

  • 值传递:安全,但费事(需要复制数据)
  • 地址传递:省事,但不安全(数据可能被更改)
#include <stdio.h>

// 利用指针实现多返回值
void FindMaxAndCount(int *max,int *count,const int *array,int length)
{
   int i;
   *max = array[0];
   *count = 1;
   for ( i = 0; i < length; i++)
   {
        if (array[i] > *max)
        {
            *max = array[i];
            *count = 1;
        }
        else if (array[i] == *max)
        {
            (*count)++;
        }
   }
   
}

int main(void)
{
    int a[] = {21,2,30,5,4,30};
    int Max;
    int Count;

    FindMaxAndCount(&Max,&Count,a,6);

    printf("Max = %d\n",Max);
    printf("Count = %d\n",Count);

    return 0;
}

image-20251207232027662

C语言 只支持1个返回值,但利用指针可以实现任意多返回值

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[20];
    char str2[] = "HelloWorld";

    strcpy(str1,str2); // 会把str2的值复制到str1中

    printf(str1);
    printf("\n");      // 换行
    printf(str2);

    return 0;
}

image-20251207232914165

#include <stdio.h>

// 返回值指针的类型演示
/*************************/
int Time[] = {23,59,55};

int *GetTime(void)
{
    return Time;
}
/************************/


int main(void)
{
     int *pt;
     pt = GetTime();

     printf("pt[0] = %d\n",pt[0]);
     printf("pt[1] = %d\n",pt[1]);
     printf("pt[2] = %d\n",pt[2]);

    return 0;
}

image-20251207233448825

文件操作

#include <stdio.h>

int main(void)
{
    FILE *f = fopen("H:\\test.txt","w"); // 创建test.txt文件,w 如果没有就创建

    fputc('A',f);  // 向文件f 写入字符A

    fputs("HelloWorld",f);  // 向文件f 写入字符串 HelloWorld

    fclose(f);

}

image-20251207234239982

#include <stdio.h>

int main(void)
{
    char a;
    char s[10];
    FILE *f = fopen("H:\\test.txt","r"); //只读方式打开文件test.txt

    a = fgetc(f); // 读取文件f 一个字符
    fgets(s,9,f); // 读取文件f 九个字符 写入 s变量


    fputs("HelloWorld",f);  // 向文件f 写入字符串 HelloWorld

    printf("%c\n",a);
    printf(s);

    fclose(f);

}

image-20251207234821715

51单片机相关

image-20251207235216566

#include <REGX52.H>
#include "LCD1602.h"

void main()
{

    unsigned char *p;

    LCD_Init();
    LCD_ShowString(1,1,"HelloWorld!");

    p = (unsigned char *)0xF1;

    LCD_ShowHexNum(2,1,*p,2);
    LCD_ShowHexNum(2,3,*(p+1),2);
    LCD_ShowHexNum(2,5,*(p+2),2);
    LCD_ShowHexNum(2,7,*(p+3),2);
    LCD_ShowHexNum(2,9,*(p+4),2);
    LCD_ShowHexNum(2,11,*(p+5),2);
    LCD_ShowHexNum(2,13,*(p+6),2);

    while (1)
    {
        /* code */
    }
    
}

image-20251208000145518

image-20251208000037214

模拟通信模块

#include <stdio.h>

/***************************/

unsigned char AirData[20];

void SentData(const unsigned char *data,unsigned char count)  // 利用指针完成地址传输,可以直接修改数据
{
    unsigned char i;
    for ( i = 0; i < count; i++)
    {
        AirData[i] = data[i];
    }
}


void ReceiveData(unsigned char *data,unsigned char count)
{
    unsigned char i;
    for ( i = 0; i < count; i++)
    {
        data[i] = AirData[i];
    }

}

/***************************/


int  main()
{

    unsigned char i;
    
    // 发送数据
    /*************************/
    unsigned char DataSend[] = {0x12,0x34,0x56,0x78};
    SentData(DataSend,4);
    printf("\nAirData = ");
    for ( i = 0; i < 20; i++)
    {
        printf("%x ",AirData[i]);
    }
    /*************************/


    // 接收数据
    /*************************/
    unsigned char DataReceive[4];

    ReceiveData(DataReceive,4);
    printf("\nReceiveData = ");
    for ( i = 0; i < 20; i++)
    {
        printf("%x ",AirData[i]);
    }
    /*************************/


    return 0;
}

image-20251208001908642

模拟通信模块,利用指针传输数据

#include <stdio.h>

/***************************/

unsigned char AirData[20];

void SentData(const unsigned char *data,unsigned char count)
{
    unsigned char i;
    for ( i = 0; i < count; i++)
    {
        AirData[i] = data[i];
    }
}


void ReceiveData(unsigned char *data,unsigned char count)
{
    unsigned char i;
    for ( i = 0; i < count; i++)
    {
        data[i] = AirData[i];
    }

}

/***************************/


int  main()
{

    unsigned char i;
    float num = 12.345f;
    
    unsigned char *p;

    p = (unsigned char *)&num; // 对num取地址

    // 发送数据
    /*************************/
    unsigned char DataSend[] = {0x12,0x34,0x56,0x78};
    SentData(p,4);             // 输入指针p 
    printf("\nAirData = ");
    for ( i = 0; i < 20; i++)
    {
        printf("%x ",AirData[i]);
    }
    /*************************/


    // 接收数据
    /*************************/
    unsigned char DataReceive[4];

    float *fp;

    ReceiveData(DataReceive,4);

    fp = (float *)DataReceive;

    printf("\nnum = %f",num);
    
    /*************************/

    return 0;
}

image-20251208002743827

posted @ 2025-12-08 00:32  Q&25  阅读(8)  评论(0)    收藏  举报