C语言指针总结


前言

通过指针的概念,作用,以及常用的几种指针(指针数组 二级指针、函数指针、void *、数组指针)对指针进行总结


一、指针的概念

1、指针:地址形象化描述,内存单元编号。
指针表示:用十六进制表示
8根地址线:
0000 0000 — 1111 1111
0x00 0x01 0x02–0xff
32根地址线:
0000…0000----1111…1111
0x00000000 0x00000001–0xffffffff
2、指针是高级工具,操作数据(指针是手段,数据是目的)
3、指针变量:存放指针的变量
int *p1 = NULL;
char *p2 = NULL;
short *p3 = NULL;

案例1:给内存单元编号为0x7f008820的空间存入一个整数0x6f00;
                 *(volatile unsigned int *)0x7f008820 = 0x6f00;

#define data1  *(volatile unsigned int *)0x7f008820;
int data2 = 0;

data1 = 0x6f00;

         int *p = NULL;
         p = 0x7f008820 ;

         *p = 0x6f00;


int data2 = 0;
int *q = NULL;
q = &data;
*q = 23;

二、指针作用:

     1、主函数“传递”多个数据给子函数,如何实现--通过指针实现
              数组--》传递数组起始地址和有效元素个数
              链表--》传递头指针
              字符串--》传递起始地址
     2、子函数“传递”多个数据给主函数,通过指针实现
             主函数申请多个空间,将起始地址传递子函数,子函数中通过指针移动存入多个
             数据,依次达到“返回”的目的。
     3、动态申请、使用和释放空间需要使用指针
     4、c依靠指针处理字符串

三、四大指针

1、指针数组

   是一个数组,数组每项存放指针
   处理多个字符串情况需要指针数组

2、 void*

1、使用案例
    void *malloc(size_t size);
    void free(void *ptr);
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    内存管理函数
    void *memset(void *s, int c, size_t n);(内存块赋值)
    void *memcpy(void *dest, const void *src, size_t n);(内存块拷贝)
    void *memmove(void *dest, const void *src, size_t n);(内存块拷贝,空间可重复)

2、使用特点
    含有void *参数的函数:处理数据不区分类型,按照字节处理
    功能具有公共性
3、特性
    含有void *参数的函数,都配备一个表示大小的参数(以字节为单位)
4、含有void *参数的函数的实现过程:
    (1)将void *转为char *
    (2)依次操作每个字节
    void *memset(void *s, int c, size_t n){
        char *st = (char*)s;
        for(int i = 0; i < n; i++){
            *(st+i) = c;
        }
        return st;
    }

3 、函数指针:

1、研究指针的目的是通过指针操作数据,指针是手段,数据是目的
2、研究函数指针的目的是通过函数指针调用函数
    函数a作为函数b的参数
3、函数指针变量:通过函数指针调用函数
    定义函数指针变量:由函数接口决定
    定义:返回值类型(*指针变量名)(形式参数类型列表) = NULL;
    指向:指针变量名 = 函数名;
    使用:调用函数:(*指针变量名)(实参列表);
    案例:函数声明:
        int add(int a,int b);
        函数指针变量定义:
        int (*p)(int,int) = NULL;
        p = add;
        调用:
        res = (*p)(3,4);
4、typedef 返回值类型 (*类型名)(形式参数变量列表);
    类型名 指针变量名 = NULL;
5、作用:解决函数作为函数参数这种情况
6、了解:函数指针数组:
    定义:返回值类型(*指针变量名[10])(形式参数类型列表) = {NULL};

4 、二级指针:

1、概念:
    (1)指向指针的指针:指针指向的空间不存放数据,存放的是地址
        int data = 0; int *p = &data; int **q = &p;
    (2)典型的二级指针:
        指针变量的地址是一个二级指针
        指针数组名是一个典型的二级指针
    (3)通过二级指针操作数据
2、作用:
    (1)内存二级分配
        char *strs[10] = {NULL};
        for(int i = 0; i < 10; i++){strs[i] = malloc(sizeof(char)*50);memset();}
        改变:
        char **strs = (char**)malloc(sizeof(char*)*10);
        for(int i = 0; i < 10; i++){strs[i] = malloc(sizeof(char)*50);memset();}
    (2)指针数组名作为函数的参数时,形式参数是二级指针
        mian函数传参int main(int argc,char*argv[])
    (3)通过函数的形式参数返回一个指针,需要使用二级指针

给main函数传递参数

1、 main函数接口
int main(int argc,char *argv[])
{
    return 0;
}
2、参数含义:
argc:存放命令行输入的字符串的个数
argv[0] -- 指向第一个字符串
argv[1] -- 指向第二个字符串

5、数组指针

 int array[4][5] = {0};
      int (*p)[5] = NULL;
      p = array;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝诗粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值