嵌入式开发之C语言学习笔记day6

指针

  • 什么是指针
    • 查询数据
    • 存储数据

什么是指针

指针 就是 内存地址

// 指针变量的定义格式
   数据类型 * 变量名
      |    |   |
      |    |   自己起的名字
      |   标记
      要跟指向变量的类型保持一致
// 例子
	int a = 10;
	int* p1 = &a;
	double b = 10;
	double* p2=&b;

指针的作用: 查询数据、存储数据、参数传递、内存管理等等

查询数据

格式: *指针名

/*
	int a = 1;                         int   指针            0x0011
	int* p1 = &a;                       *   0x0011           10
	*p                                  p                   int a
	*表示:解引用运算符
*/
#include 
int main(){
     // 利用指针去获取变量中的数据/存储数据
     int a = 1;
     // 定义一个指针去指向变量a
     int* p = &a;
     // 利用指针来获取变量中的数据
     printf("%d\n", *p);
	return 0;
}

存储数据

格式: *指针名 = 数据值;

#include 
int main(){
     int a = 1;
     int* p = &a;
     printf("%d\n", *p);
     // 利用指针去存储数据/修改数据
     *p = 50;
     printf("%d\n", *p);
     printf("%d\n", a);
	return 0;
}

指针的使用细节:

  1. 指针变量的名字
  2. 指针变量的数据类型要跟指向变量的类型保持一致
  3. 指针变量占用的大小,跟数据类型无关,跟编译器有关(32位:4字节;64位:8字节)
  4. 给指针变量赋值的时候,不能把一个数值赋值给指针变量
// 第3个注意细节
#include 
int main(){
     char c = 'a';
     char* p1 = &c;
     long long n = 100;
     long long* p2 = &n;
     printf("%zu\n", sizeof(p1));   // 8
     printf("%zu\n", sizeof(p2));   // 8
	return 0;
}
// 第4个注意细节
/*
	int a = 10;                                   int a = 10;
	int* p = &a;                                  int* p = 50;
	这里的&a:赋值已分配空间的内存地址               这里的50:赋值未分配空间的内存地址
*/

指针的作用:

  • 作用1: 操作其他函数中的变量
#include 
void swap(int* p1, int* p2);
int main(){
     // 定义两个变量,要求变换变量中记录的值
     // 注意:交换的代码写在一个新的函数swap中
     // 1.定义两个变量
     int a = 10;
     int b = 20;
     // 2.调用swap函数
     printf("调用前:%d, %d\n",a, b);
     swap(&a,&b);  // 调用a和b的地址
     printf("调用后:%d, %d\n",a, b);
	return 0;
}
void swap(int* p1, int* p2)
{
	 // 此时交换的是p1指向的变量和p2指向的变量的值
     int temp = *p1;
     *p1 = *p2;
     *p2 = temp;
}

指针的作用细节: 函数中变量的生命周期与函数相关,函数结束对应的变量消失。此时在其他函数中,就无法通过指针使用。如果不想函数中的变量被回收,可以在变量前面加static关键字。

#include 
int* method();
int main(){
     // 调用method函数,并使用该函数中的变量a
     int* p = method();
     printf("拖时间!\n");
     printf("%d\n",*p);  
     // 如果没有static,则结果不能打印的,因为method函数结束后,那么该函数里面所有的变量也会随之消失
	return 0;
}
int* method()
{
     static  a = 10;  // 此时,变量一直保存到程序结束
     return &a;
}
  • 作用2: 函数返回多个值
#include 
void max_min(int arr[], int len, int* max, int* min);
int main(){
     int arr[] = {1,2,3,4,5,6,7,8,9};
     int len = sizeof(arr) / sizeof(int);
     int max = arr[0];
     int min = arr[0];
     max_min(arr, len, &max, &min);   // 这里参数传入max和min的地址,也就是下面子函数中 【*地址(数据)】
     printf("数组的最大值为%d\n", max);  // 这里输出的max和min就是对应max、min地址里面存放的数据值
     printf("数组的最小值为%d\n", min);
	return 0;
}
void max_min(int arr[], int len, int* max, int* min)   // 可以理解 数值==*地址
{
     *max = arr[0];               // *max指针,如果max是传入的是max的地址,那么*max就是该地址存放的值
     int i;                       
     // 这个后面意思就是将数组的第一个值赋值给*max,然后依次进行查找,找到最大值,并且将最大值变量存在max地址里
     for(i=0; i<len; i++)         
     {
          if(arr[i]>*max)
          {
               *max = arr[i];
          }
     }
     *min = arr[0];
     for(i=0; i<len; i++)
     {
          if(arr[i]<*min)
          {
               *min = arr[i];
          }
     }
}
  • 作用3: 函数的结果和计算状态分开
#include 
int getReminder(int a, int b, int* res);
int main(){
     // 定义一个函数,将两数相除,获取他们的余数
     int a=10;
     int b=3;
     int rem = 0;
     int flag = 0;

     flag = getReminder(a, b, &rem);
     if (!flag){
          printf("余数为:%d\n",rem);
     }
	return 0;
}
int getReminder(int a, int b, int* res)
{    
     if(b==0)      // 如果除数为0,则计算状态为1
     {
          return 1;
     }
     *res = a%b;   // 如果除数不为0,则计算状态为0, 计算余数
     return 0;
}
  • 作用4: 方便的操作数组和函数(指针高级)---- 见 嵌入式开发之C语言学习笔记day7

你可能感兴趣的:(嵌入式学习之C语言,c语言,学习,笔记)