手记

【九月打卡】第1天【养成记】嵌入式挑战第1天,C语言中的指针基础、C语言中的特殊指针

课程章节:

  • 课程名称:物联网/嵌入式工程师
  • 章节名称:第2周之第二讲 1-1 至 1-4 C语言中的指针基础、C语言中的特殊指针
  • 讲师姓名:大白老师

课程内容:

C语言中的指针基础

内存操作

      write
data ------>ram

      read
ram  ------> data

C语言中分配内存的方法

通过变量名来分配
int  a;   //分配4byte的空间

C语言中对内存读写的方法

(1) 通过操作变量名来实现
   int  a; 
   a = 100;  //写操作
   printf("a = %d\n",a); //读操作
   
(2) 通过内存地址来进行读写操作
        
        int  a;
 内存地址的获得方法:  &a
 
规则:  
        *  +  地址: 访问地址中的内存

        *(&a) = 100 ;//写操作
        printf("*(&a) = %d\n",*(&a)); //读操作 

代码示例

#include <stdio.h>

int main()
{
    int a = 80;

    //写操作
    *(&a) = 66; 

    //读操作
    printf("*(&a) = %d\n",*(&a));

    printf("a = %d\n",a); //66
    return 0;
}

执行结果:

C语言中指针类型的设计的由来

常量           变量的类型
10               int 
3.15             float 
'A'              char 

0xdff88           ?
(内存地址)

思考:内存地址该用什么样的类型来保存呢?
答: 为了解决这样的问题,C语言的设计者创建了指针类型,来保存内存地址。

C语言的指针类型的定义方法

简介

数据类型 * 指针变量名;

例如:
char * p;  //p的类型为char *
short *q;  //q的类型为short *
int *m;    //m的类型为int *

使用方法

int  data = 10;

int * p = &data;

*p = 88;
printf("*p = %d\n",*p)

图解

代码示例

#include <stdio.h>

int main()
{
      int data1 = 0,data2 = 0;
      int * p = &data1;  //p = &data1;
      int * q = &data2;  //q = &data2;
      int sum = 0;

      printf("please input two data : ");
      scanf("%d%d",p,q);

      printf("data1 = %d data2 = %d\n",data1,data2);

      sum = *p + *q;
      printf("data1 + data2 = %d\n",sum);

      sum = *p - *q;
      printf("data1 - data2 = %d\n",sum);

      sum = data1 * data2;
      printf("data1 * data2 = %d\n",sum);

      sum = data1 / data2;
      printf("data1 / data2 = %d\n",sum);
          
      return 0;
}

执行结果:

课后练习

练习

int  data1 = 10,  data2 = 20;
int *p = NULL;
int *q = NULL;

//1.要求实现p和q分别保存data1和data2的地址.
//2.利用p和q交换data1和data2的值
//3.输出data1和data2的值

代码

#include <stdio.h>

int main()
{
    int  data1 = 10,  data2 = 20;
    int *p = NULL;
    int *q = NULL;

    p = &data1,q = &data2;

    *p = *p ^ *q;
    *q = *p ^ *q;
    *p = *p ^ *q;

    printf("data1 = %d data2 = %d\n",data1,data2);

    return 0;
}

执行结果:

C语言中的特殊指针

野指针

野指针:野指针指的是指针中保存的是无效的内存地址。用户直接使用,系统会提示段错误.
   
例如:
int *p;
*p = 800;

Segmentation fault (core dumped) 段错误: 一般由用户访问了非法的内存所导致。

代码示例:

#include <stdio.h>

int main()
{
    int *p;
    
    *p = 800;
    
    printf("*p = %d\n", *p);
    return 0;
}

执行效果:

void * 指针

void * 是一种特殊的指针类型,可用于存放任意对象的地址。   

例如:
int  a = 10;

void *p = &a; 

缺点: 由于不知道地址中存放的是何种类型的数据,因此不能直接操作void*指针所指的对象

代码示例

#include <stdio.h>

int main()
{
    int data = 100;
    void *p = &data;
    
    printf("result = %d\n", *(int *)p);
    return 0;
}

执行结果:

NULL指针

//例如:   int a = 0;
        
#define NULL (void *)0 

用户习惯:  int *p = NULL;

含义: 定义指针的时候,一般会把指针的值初始化为0地址,仅仅用于初始化,
       0地址我们用户一般,没有执行权限。直接对0地址操作操作,系统会提示段错误。
           
例如:
int *p = NULL; 
*p = 800;

Segmentation fault (core dumped) 段错误: 一般由用户访问了非法的内存所导致。

代码示例

#include <stdio.h>

int main()
{
    int data = 800;
    int *p = NULL;
    
    p = &data;
    
    printf("result = %d\n", *p);
    return 0;
}

执行结果:

学习笔记:

课后练习

练习

double f = 3.14;

//1.要求定义void *类型的指针保存f的地址.
//2.通过指针输出3.14的值

代码

#include <stdio.h>

int main()
{
    double f = 3.14;
    void *p = &f;
    
    printf("result = %f\n", *(double *)p);
    return 0;
}

执行结果:

课程评价:

通过这节课的学习,对地址有了更深入的了解,使用指针的方式有了基本的操作。

0人推荐
随时随地看视频
慕课网APP