C语言 指针总结

相信学习C语言的小伙伴都在指针这里碰过壁,指针也是大家熟知的几大难点之一,下面我们具体总结一下指针的知识点,带大家详细了解指针

指针的初阶

1. 指针是什么?

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向
(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以
说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址
的内存单元

那么我们可以这样理解:

指针是个变量,用来存放内存单元的地址

那么对应到代码:

#include<stdio.h>

int main()
{
    int a = 0;//在内存中开辟一处空间
    int* p = &a;//取出a变量的地址放在p变量中
                //p变量就是一个指针变量
    return 0;
}

总结:指针就是变量,用来存放地址的变量,指针的大小在32位平台上是4个字节,在64位平台上是8个字节。

2.指针和指针类型

#include<stdio.h>

int main()
{
    char* pc = NULL;
    int* pi = NULL;
    short* ps = NULL;
    long* pl = NULL;
    float* pf = NULL;
    double* pd = NULL;
    return 0;
}

指针+-整数 

#include<stdio.h>

int main()
{
    int n = 10;
    char* pc = (char*)&n;
    int* pi == &n;

    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    return 0;
}

总结: 指针的类型决定了指针向前或者向后走一步有多大(距离)。

指针的解引用

#include<stdio.h>

int main()
{
    int n = 0x11223344;
    char* pc = (char*)&n;
    int* pi = &n;
    *pc= 0;//观察调试过程中内存的变化
    *pi = 0;//观察调试过程中内存的变化
    return 0;
}

总结 :指针的类型决定了对指针解引用的时候能操作几个字节。

3.野指针

野指针成因

1.指针未初始化

#include<stdio.h>
int main()
{
    int* p;//局部变量指针未初始化
    *p = 20;
    return 0;
}

2.指针越界访问 

#include<stdio.h>

int main()
{
    int arr[10] = {0};
    int* p = arr;
    int i = 0;
    for(i = 0; i < 11; i++)
    {
        //指针指向的范围超过数组arr的范围时,p就是野指针
        *(p++) = i;
    }
    return 0;
}

如何规避野指针

1.指针初始化

2.小心指针越界

3.指针指向空间释放即使置NULL

4.指针使用之前检查有效性

#include<stdio.h>

int main()
{
    int* p = NULL;
    int a = 10;
    p = &a;
    if(p != NULL)
    {
        *p = 20;
    }
    return 0;
}

4. 指针与数组

数组名是什么?

数组名表示的是数组首元素地址

#include<stdio.h>

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

通过指针来访问数组

arr[i]  -->  *(p + i)

#include<stdio.h>

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* p = arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for(i = 0; i < sz; i++)
    {
        printf("%d ", *(p + i));
    }
    return 0;
}

5.二级指针 

指针变量的地址的存放

#include<stdio.h>

int main()
{
    int a = 10;
    int* p = &a;
    int** pp = &p;
    return 0;
}

6.指针数组

指针数组是存放指针的数组 

int* arr[5]

指针的进阶

1.字符指针

一般使用方式

#include<stdio.h>

int main()
{
    char ch = 'w';
    char* pc = &ch;
    *pc = 'w';
    return 0;
}

另一种方式

#include<stdio.h>

int main()
{
    char* pstr = "hello world";
    printf("%s\n", pstr);
    return 0;
}

2.数组指针

数组指针格式

int (*p)[5]

*和p结合说明p是一个指针变量,然后指向的是一个大小为5 的整型数组

所以p是一个指针变量,指向一个数组,叫数组指针

&数组名 和 数组名的区别

int arr = 10;

arr表示的是数组首元素的地址

&arr表示的是整个数组的地址,而不是数组首元素的地址

#include<stdio.h>

int main()
{
    int arr[10] = { 0 };
    printf("%p\n", arr);
    printf("%p\n", &arr);

    printf("%p\n", arr + 1);
    printf("%p\n", &arr + 1);
    return 0;
}

3.函数指针

#include<stdio.h>

int add(int a, int b)
{
    return a + b;
}

void test(int (*p)(int, int))//函数指针
{

}

int main()
{
    int a = 10;
    int b = 20;
    add(a, b);
    test(add);
    return 0;
}

 以上即为 C语言指针大部分内容详解,感谢大家观看

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值