C语言指针

前言:\n对C语言来说,指针是一个难点,如果用C语言来写数据结构的话,掌握指针的用法是必须的,如果指针没学好,学数据结构很吃力。所以希望大家一定要掌握指针啊!!!\n\n1.指针的概念\n1.指针就是个变量,用来存放地址,地址唯一表示一块内存空间。\n\nps:(内存编号 = 地址 = 指针)\n\n2.指针的大小是固定的4/8个字节(32位平台/64位平台)\n\n2.指针的类型\n指针是有类型的,指针的类型决定了指针+-整数的步长,指针解引用时候的权限。\n\n下面我来解释一下上面的红色部分的意思,举个例子,看一下下面的代码及运行结果:\n\n#include\u003Cstdio.h>\nint main()\n{\n\tint a = 4;\n\tint* p1 = &a;\n\tchar* p2 = &a;\n\tprintf(\"%p\\n\", p1);\n\tprintf(\"%p\\n\", p2);\n\tprintf(\"%p\\n\", p1+1);\n\tprintf(\"%p\\n\", p2+1);\n\treturn 0;\n}\n\n\n 刚开始p1和p2地址是一样的,但后面让p1和p2分别进行+1,后面的结果就不同了,p1加的1是int类型的1,而p2+1加的是char类型的1。\n\n上面我们说到指针的大小是固定的4/8个字节,假设是32位平台,那么一个指针就占4个字节。如果这时我定义一个整型指针和字符指针,那么这个整型指针在解引用时就可以访问4个字节,而字符指针就只能访问1个字节。\n\n3.野指针\n野指针的概念就是:指针的位置是不可知的\n\n3.1野指针的成因:\n野指针的成因有两个:1.指针未被初始化   2.指针的越界访问\n\n给大家解释一下:\n\n指针未被初始化\n\n这个应该很好理解,就是我们在创建指针变量的时候没有让它指向任何对象\n\n例如: int* p;   这样p就是一个局部变量,p就是一个随机值 \n\n指针的越界访问\n\n看一下下面的代码:\n\n#include\u003Cstdio.h>\nint main()\n{\n\tint arr[5] = { 1,2,3,4,5 };\n\tint* p = arr;\n\tint i = 0;\n\tfor (i = 0; i \u003C 6; i++)\n\t{\n\t\tprintf(\"%d \", *p);\n\t\tp++;\n\t}\n\treturn 0;\n}\n先给大家解释一下这个代码的原理,int* p = arr; 这里arr是数组名,数组名是首元素的地址\n\n那么现在p就是首元素的地址  对p进行解引用就是*p ,*p的值就是 1\n\np++;  这行代码就是让p的地址++;指针的大小是固定的4/8个字节, int型数据在C语言中也是4/8个字节,我们拿到的指针都是数据第一个字节的地址,而数组在内存中又是连续的,p++就是刚好往后移动一个数据。\n\n但是现在arr数组一共就只有5个元素,但是循环6次必然会导致数组的越界,那我们来看一下运行结果\n\n\n\n前面5个数就是arr数组里面的数,第6个值就是一个随机值。因为当循环到第6次时,p已经没有指向的对象了,此时p就是一个野指针了。\n\n 3.2如何避免野指针?\n1.善于使用NULL,及时对指针进行初始化\n\n如果你在定义指针变量的时候,就已经想到指针变量指向的对象,那就直接进行初始化。\n\n如果你在定义的时候,还不清楚指针指向的对象,也不清楚后面要不要使用指针,那就对指针变量赋值为NULL   \n\nNULL就是空的意思,如果int *p=NULL; 那么此时p就是一个空指针,后面可以重新赋值,并不影响后面的使用。如果一个指针是空指针,在你还没初始化前不要使用它。\n\n2.避免指针的越界\n\n3.避免返回局部变量的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值