手把手带你搞懂C语言指针

 更新时间:2021年08月26日 16:11:43   作者:宝全哥哥  
这篇文章主要介绍了C语言的指针,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助

前言

自学笔记,没有历史知识铺垫(省略百度部分),C语言指针的使用

一、概念

1.*指针

指针: 内存资源的地址指针
变量:存放指针的盒子 32位操作系统中,其大小位32bit,即4个字节,64位为64bit,即8个字节,与指针数据类型无关
指针的数据类型: 表示指针要读取的地址字节数,如:char *p;读取1个字节,int *p读取4个字节,具体选择根据指向的变量调整
指针指向的内存空间一定要合法(存在,且有读的权限)

int main()
{
    int *p1;
    char *p2;
    //p1:4,p2:1 
    printf("p1:%lu,p2:%lu \n",sizeof(*p1),sizeof(*p2));
    return 0;
}

指针变量的写法:*p_xx
指针变量通常以*p_开头,是英文指针Pointer的首字母

2.&取址

&a 变量a的内存地址

int main()
{
    int a = 12312312;
    int *p1;
    p1 = &a;
    //*p1指针指向变量的值:12312312,p1指向的内存地址E9C4AE18(等价于&a)
       printf("*p1:%d,p1指向的内存地址%X",*p1,p1);
    return 0;
}

二、指针修饰符

1.const 常量指针

const char *p; 从右往左理解: *p指针 char指向1个字节的内容 const该字节内容为只读 场景:描述字符串
char *const p; 从右往左理解:*p指针 const指针方向为只读(无法切换) char指向的内容是1字节,内容允许修改 场景:硬件资源
const char *const p; 结合了上面1和2的限制,指针方向为只读,指向的内容为只读 场景:ROM设备

//以下两个写法的作用是一样的
const char *p;
char const *p;
//以下两个写法的作用是一样的
char *const p;
char *p const;

2.volatile 特征指针

volatile char *p;防止优化指向内存地址(阻止指令重排)

3.typedef 别名指针

为指针起别名,复杂的指针场景使用,提高代码可读性
typedef char *xx_p

三、指针运算

1. ++ -- + -

指针的运算都是指向地址的运算,最小单位为当前指针变量的数据类型所占的内存大小
如:p+1的效果为0x20+1*(sizeof(p))

2.[] 标签访问

指针指向的内存位置,标签默认为0,及:p[0]
标签访问一般用于非线性访问,如:访问当前指针指向内存位置的后边第二个位置p[2]效果为*(p+2)
使用标签访问,则取出的是标签内存里的值,而不是地址
C语言的标签化默认是允许越界的,甚至用标签扫描整个内存,修改不同应用的属性

int main()
{
    int a = 0x123;
    int a1 = 0x134;
    int a2 = 0x145;
    int *p;
    p = &a1;
    //*p:134 ,*(p-1):145 ,p[-1]:145,p[1]:123 
    printf("*p:%X ,*(p-1):%X ,p[-1]:%X,p[1]:%X \n",*p,*(p-1),p[-1],p[1]);
    return 0;
}

四、指针逻辑操作

>= == <= != 指针可以做逻辑操作,比较大小,但实际运用的比较少
p1 > p2 指针所占的地址比较,意义不大
p1 == n 一般跟一个特殊值比较,比如p1 == 0x0,地址的无效值,结束标识,表示p1处理完了
*p1 > *p2 实际上是指向变量值的比较

注意:
指针必须是同类型比较才有意义

总结

本章主要为C语言指针

Segmentation fault 段错误异常,通常是指针指向问题引起

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++日期与时间 chrono库介绍及使用教程

    C++日期与时间 chrono库介绍及使用教程

    chrono库是C++11中的一个标准库,它提供了一系列与时间相关的类和函数,用于表示和处理时间间隔,时钟和时间点,C++20新增Calendar,这篇文章主要介绍了C++日期与时间 chrono库介绍及使用,需要的朋友可以参考下
    2023-12-12
  • VC中SendMessage和PostMessage的区别

    VC中SendMessage和PostMessage的区别

    这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C语言自定义数据类型的结构体、枚举和联合详解

    C语言自定义数据类型的结构体、枚举和联合详解

    这篇文章主要给大家介绍了关于C语言自定义数据类型的结构体、枚举和联合的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C++ 简单的任务队列详解

    C++ 简单的任务队列详解

    下面小编就为大家带来一篇C++ 简单的任务队列详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 如何在C++类的外部调用类的私有方法

    如何在C++类的外部调用类的私有方法

    这篇文章主要介绍了如何在C++类的外部调用类的私有方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • C语言链表实现通讯录系统课程设计

    C语言链表实现通讯录系统课程设计

    这篇文章主要为大家详细介绍了C语言链表实现通讯录系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • OnSize、OnSizing和OnGetMinMaxInfo区别分析

    OnSize、OnSizing和OnGetMinMaxInfo区别分析

    这篇文章主要介绍了OnSize、OnSizing和OnGetMinMaxInfo区别分析,需要的朋友可以参考下
    2015-01-01
  • 通过GDB学习C语言的讲解

    通过GDB学习C语言的讲解

    今天小编就为大家分享一篇关于通过GDB学习C语言的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 一篇文章教你在C++中操作符可分为哪几种类和用法

    一篇文章教你在C++中操作符可分为哪几种类和用法

    这篇文章主要介绍了C++编程中操作符的种类和用法,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • C++ 路径中./、../、/代表的含义

    C++ 路径中./、../、/代表的含义

    这篇文章主要介绍了C++ 路径中./、../、/代表的含义,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论