深度剖析指针的进阶用法(对指针会有一个新的认识)

本文详细探讨了C语言中指针的各种进阶用法,包括字符指针、指针数组、数组指针、数组参数与指针参数的交互,以及函数指针和函数指针数组的概念。通过实例解析了如何使用函数指针实现回调函数和转移表,帮助读者深化对指针操作的理解。
摘要由CSDN通过智能技术生成

首先我们必须要了解以下几点:

     1. 指针就是一个变量,用来存放地址,地址唯一标识一块内存空间
     2. 指针的大小是固定的4/8个字节(32位平台/64位平台)
     3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限
     4. 指针的运算,指针-指针的绝对值为两个指针在内存中的距离

一、字符指针

        我们知道有一种指针类型为字符指针char* 

用法一

char p='C';
char *L=&p;
*L='W';

用法二 

int main()
{
    char arr[] = "abcdef";
    char* pc = arr;
    printf("%s\n", arr);
    printf("%s\n", pc);
}


输出两个字符串"abcdef"
这里其实是把字符串的首字符a的地址放进了指针里
int main()
{
    const char* p = "abcdef";//这里把首字符的地址放在了p中,"abcdef"是一个常量字符串
    //*p = 'W';
    printf("%s\n", p);
    //printf("%c\n", *p);
    //printf("%s\n", p);
    return 0;
}

输出abcdef

有一道题

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abcdef";
    const char* p1 = "abcdef";
    const char* p2 = "abcdef";
    if (p1 == p2)
    {
        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }

    //输出hehe
     if (arr1 == arr2)
    {
        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }
    return 0;
    //输出haha

    //arr1[]和arr2[]地址不同,*p1和*p2地址相同
}

为什么得到这样的结果呢?

因为arr1和arr2指向的是同一常量字符串,C通常会把常量字符串存储到一个单独的一个内存区域,当几个指针,用相同的常量字符串去初始化不同的数组会开辟不同的内存块,所以arr1!=arr2

*指向同一个字符串的时候,它们实际会指向同一块内存,所以*p1 =*p2

二、指针数组

指针数组是数组,用来存放指针的

int main()
{
    int arr[10] = { 0 };
    char ch[5] = { 0 };
    int* parr[4];//存放整型指针的数组 - 指针数组
    char* pch[5];//存放字符指针的数组 - 指针数组
    return 0;
}
int main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[] = { 2,3,4,5,6 };
    int arr3[] = { 3,4,5,6,7 };
    int* parr[] = { arr1,arr2,arr3 };
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        int j = 0;
        for (j = 0; j < 5; j++)
        {
            printf("%d", *(parr[i] + j));
        }
        printf("\n");
    }
    return 0;
}

输出:
12345
23456
34567

三、数组指针

数组指针是指针,指向数组的指针

就是说,指针数组是一个数组里面的每一个指针里面放的是一个个指针;数组指针是一个个指针里面的每一个地址存放的是一个个数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值