day03 指针应用和文件操作
C语言指针的详解与应用




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





关于指针 p++ 的操作

#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;
}

#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;
}

#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;
}



#include <stdio.h>
void fun(int param)
{
printf("%x\n",param);
}
int main()
{
int a = 0x66;
fun(a); // 值传递本质是复制,两份数据存储在不同的位置
return 0;
}

#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;
}

- 值传递:安全,但费事(需要复制数据)
- 地址传递:省事,但不安全(数据可能被更改)
#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;
}

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;
}

#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;
}

文件操作
#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);
}

#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);
}

51单片机相关

#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 */
}
}


模拟通信模块
#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;
}

模拟通信模块,利用指针传输数据
#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取地址
// 发送数据
/*************************/
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;
}


浙公网安备 33010602011771号