赞
踩
在C语言中给内存单元的编号起了个名字叫做指针,通俗来说就是地址。(内存单元编号=地址=指针)
1.指针变量与地址
int a=10;
int* p=&a;
* 说明了这里p的是指针变量;int*说明p是一个整形指针;int说明p指向的对象a是一个整形;&a是取出a的地址; 总的来说就是取出a的地址存放在p里。
2.解引用操作符 *
*和指针变量搭配起来就是解引用,就是取出指针变量里的数值。
int a=10;int* p=&a;int b=*p;→ b=10 用一张图描述如下
3.指针变量的大小
指针变量的⼤⼩取决于地址的⼤⼩
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
即不管是指针类型是char*、short*、int* 、double * 32位平台下大小为4Byte,64位平台下大小为8Byte
4.指针+-整数
比如: char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。这就是指针变量的类型差异带来的变化。指针+1,其实跳过1个指针指向的元素。指针-1也是如此,只是相反,向后退。
- //野指针形成的原因:
- #include <stdio.h>
- //1.指针没有初始化
- int main1()
- {
- int* p;//局部变量指针未初始化,默认为随机值
- * p = 20;
- return 0;
- }
- //2.指针越界访问
- int main2()
- {
- int arr[10] = { 0 };
- int* p = &arr[0];
- int i = 0;
- for (i = 0; i <= 11; i++)
- {
- //当指针指向的范围超出数组arr的范围时,p就是野指针
- * (p++) = i;
- }
- return 0;
- }
- //3.指针指向的空间释放
- int* test()
- {
- int n = 100;
- return &n;
- }
- int main()
- {
- int* p = test();
- printf("%d\n", *p);//test()中n是一个局部变量,使用完之后n变量申请的空间就会被释放
- return 0;
- }
ps:指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性 →指针变量=NULL
7.传值调⽤和传址调⽤
见之前写的博客C语言笔记8-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。