C语言指针的详解与应用




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





关于指针 p++ 的操作

#include <stdio.h>
int main()
{char a = 0x66;char *p; // 星号通常和变量名放在一起,防止歧义p = &a; // 把a的地址给pprintf("%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 写入字符Afputs("HelloWorld",f); // 向文件f 写入字符串 HelloWorldfclose(f);}

#include <stdio.h>int main(void)
{char a;char s[10];FILE *f = fopen("H:\\test.txt","r"); //只读方式打开文件test.txta = fgetc(f); // 读取文件f 一个字符fgets(s,9,f); // 读取文件f 九个字符 写入 s变量fputs("HelloWorld",f); // 向文件f 写入字符串 HelloWorldprintf("%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;
}
