c语言——指针

定义指针变量:

类型名 *指针变量名

char  *pa ; //定义一个指向字符型的指针变量
Int  *pb ; //定义一个指向整型的指针变量

指针和指针变量

  • 存放的值叫做指针
  • 存放地址的变量叫做指针变量

取地址运算符和取值运算符

如果需要获取某个变量的地址,可以使用取地址运算符(&):

char  *pa = &a;
int  *pb =  &f;

如果需要访问指针变量指向的数据,可以使用取值运算符(*):

prinrf(“%c, %d \n”, *pa, *pb);

指向数组的指针

char *p;
p = a; //语句1
p = &a[0];  //语句2

指向数组就是指向数组第一个元素的地址。语句1和语句2相等

避免使用未初始化的指针

指针的运算:

当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做对意义相当于指向距离指针所在位置向前或向后第n个元素

对比标准型下标访问数组元素,这种使用指针进行间接访问的方法叫做指针法。
注:p+1并不是简单地将地址加1,而是指向数组的下一个元素。

指针与数组的区别

指针和数组名都指向一个地址
但是数组名只是一个地址,而指针是一个左值。(应该是可以进行解引用的???)

int *p1[5];指针数组

指针数组:指的是每个元素都是整型的指针变量

下标01234
元素int *int *int *int *int *

int (*p2)[5];数组指针

数组指针:是一个指针,指向的是一个数组

下标01234
元素intintintintint

指针与二维数组

int array[5][5];

*(array+1)表示第二行的首地址的值
*(array+1) == array[1]

((array+1)+3)表示第二行第四列的值

void指针

void指针通用指针,就是可以指向任意类型的数据。任何类型的指针都可以赋值给void指针。

NULL指针

不清楚要将指针初始化为什么地址时,请将它初始化为NULL。在对指针进行解引用时,先检查指针是否为NULL。

指向指针的指针

#include <stdio.h>
int main( )
{ 
        int num =520;
        int *p = &num;
        int **pp = &p;
        return 0;
  }

指针数组和指向指针的指针
至少有两个好处:
1、避免重复分配内存
2、只需要进行一处修改

常量:

宏定义

#define

还可以使用const关键字修饰

指向常量的指针

#include <stdio.h>
int main()
{
    int  num = 520;
    const int cnum = 880;
    const int *pc = &cnum;
     pc = &num;
     printf(“pc: %d, pc: %p\n”, *pc, pc);
}

指向常量的指针(int * const p = #)
总结:

  • 指针可以修改为指向不同的常量
  • 可以通过解引用来读取指针指向的数据
  • 不可以通过解引用修改指针指向的数据
    常量指针
  • 指向非常量的常量指针
    -指针自身不可以被修改
    -指针指向的值可以被修改
  • 指向常量的常量指针(const int * const p = # )
    -指针自身不可以被修改
    -指针指向的值也不可以被修改

形参实参:

形参只是一个占位符,只在函数内部有效

传值和传址:
传值时在函数中修改,并不会影响main函数中的值
传地址修改,会影响main函数中的值

传数组:
并不是以数值的形式传到函数中,而是以地址的方式传到函数中。
可变参数

#include <stdarg.h>
-va_list
-va_start
-va_arg
_va_end

指针函数

int *p();

注:不要返回局部变量的指针

函数指针

#include <stdio.h>
int square(int);
int square(int num)
{
    return num*num;
}
int main( )
{
    int num;
    int (*fp)(int);
    printf(“请输入一个整数:”);
    scanf(“%d”,&num);
    
    fp = &square;
    prinrf(“%d*%d=%d\n”,num,num,(*fp)(num))
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值