C语言——指针(函数)

指针的引入
为函数修改实参提供支持。
为动态内存管理提供支持。
为动态数据结构提供支持。
为内存访问提供另一种途径。

指针概述

内存地址:

系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字节),并为每一个内存单元进行了编号,内存单元的编号称为该内存单元的地址。一般情况下,我们每一个变量都是由多个内存单元构成的,所以每个变量的内存地址,其实就是这个变量对应的第一个内存单元的地址,也叫首地址

变量指针:

变量地址称为该变量的指针。变量地址往往是指变量在内存中第一个内存单元的编号(首地址)

指针变量:

存放其他变量地址的变量。

指向:

指针变量中存放“谁"的地址,就说明该指针变量指向了“谁”。

*:指针运算符

指针变量的定义

语法:

数据类型 *变量列表;

注意:

1.虽然定义指针变量 *a ,是在变量名前加上*,但是实际变量名为a,而不是*a。

2.使用指针变量间接访问内存数据是,指针变量必须要有明确的指向;

3.如果想借助指针变量间接访问指针变量保存的内存地址上的数据,可以使用指针变量前加*来接访问;指针变量前加*,也称为对指针变量解引用。

4.指针变量只能指向同类型的变量,借助指针变量访问内存,一次访问的内存大小是取决于指针变量的类型。

5.指针变量在定义同时可以初始化:这一点和普通变量是一样的。

指针变量的使用

指针变量的赋值:

方式1
int a,*p;
p=&a;//指针变量的值是其他变量的地址

 

方式2
int a,*p,*q = &a;
p =q;

操作指针变量的值:

int a,*p,*q = &a;

p = q;
printf("%p",p);//此时返回的是变量a的地址空间

操作指针变量指向的值:

int a =6, *q =&a;
printf("%d”,*q)://6

两个有关运算符的使用:

&        取地址运算符。&a是变量a的地址。

*         指针运算符(或称"间接访问"运算符),*p是指针变量p指向的对象的值。

eg:

#include <stdio.h>
void main()
{ 
    int a,b;
    int *pointer_1, *pointer_2;
    a=100;  b=10;
    pointer_1=&a; 
    pointer_2=&b; 
    printf("a=%d,b=%d\n",a,b);
    printf("pointer_1=%d,pointer_2=%d\n",*pointer_1,*pointer_2);
}

案例1:

声明a,b两个一般变量,使用间接存取的方式实现数据的交换?

(直接存取和间接存取都是数据互换,直接存取是交换值,间接存取是交换指向)

代码:

/*
需求:声明a,b两个一般变量,使用间接存取的方式实现数据的交换
*/

#include <stdio.h>

void main()

{
    // 声明5个变量
    int a = 3,b = 5,*p_a=&a,*p_b=&b,*p_t;
    // 交换前输出
    printf("%d,%d\n",*p_a,*p_b);

    // 交换位置
    p_t = p_a;
    p_a = p_b;
    p_b = p_t;
    // 交换后输出
    printf("%d,%d\n",*p_a,*p_b);
}

案例2:

指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。

代码:

/*
需求:指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。
*/
#include <stdio.h>

void main()
{
    int a = 3,b = 5,*p_a = &a,*p_b = &b,*p_t;

    if( a < b)
    {
       p_t = p_a;// 操作指针变量,不会影响到数据本身
       p_a = p_b;
       p_b = p_t;
    }

    printf("按从大到小输出a,b的值:%d > %d\n",*p_a,*p_b);
}

指针变量做函数参数

指针变量做函数参数往往传递的是变量的地址(首地址),借助于指针变量间接访问是可以修改实参变量数据的。

案例1:

需求:要求用函数处理,用指针变量作函数的参数。

方式1:交换指向(指向的普通变量的值不变)

eg:

#include <stdio.h>
/* 需求:指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。 
*/
/* 自定义函数,实现两个数的比较 */
void swap(int *p_a,int *p_b)
{
    int *p_t;
    // 这种写法,只会改变指向,不会改变地址对应空间的数据
    p_t = p_a;
    p_a = p_b;
    p_b = p_t;
    
    printf("%d > %d\n",*p_a,*p_b); // 5 > 3
}

void main()
{
    int a = 3,b = 5;
    if(a < b) swap(&a,&b); // int *p_a = &a,int *p_b = &b
    
    printf("%d > %d\n",a,b);// 3 > 5
    
    
}

方式2:交换值(指向的普通变量的值改变)

eg:

#include <stdio.h>

/* 需求:指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。 
*/
/* 自定义函数,实现两个数的比较 */
void swap(int *p_a,int *p_b)
{
    int t;
    // 这种写法,只会改变指向,不会改变地址对应空间的数据
    t = *p_a;
    *p_a = *p_b;
    *p_b = t;
    
    printf("%d > %d\n",*p_a,*p_b); // 5 > 3
}
void main()
{
    int a = 3,b = 5;
    
    if(a < b) swap(&a,&b); // int *p_a = &a,int *p_b = &b
    
    printf("%d > %d\n",a,b);// 5 > 3
   
   
}
  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值