1.指针定义类型有很多种,如:int * ,char * ,double * ,short *等,这里要注意到的是在编译器32位环境下,所有指针都占4个字节,32个bites,而在64位环境下,所有指针都占8个字节,64个bites,所以如果题目中出现,所有指针都占4个字节这类选项,那么这个选项一定是错的,因为说法过于绝对。
再来讲讲这些类型一次读取的空间内存,int *一次读取4个字节,char * 一次读取1个字节,short *一次读取2个字节,,double 读取8个字节,float 读取4个字节,所以题目中若出现不同类型的指针指向,一定要注意一次读取几个字节如这组编码:
因为取数组定义的为整型,而指针p为short类型,因此p每次只能指向两个字节,for循环对数组中内容进行修改时,一次访问的是: arr[0]的低两个字节,arr[0]的高两个字节,arr[1]的低两个字节,arr[1]的高两个字节,这里不能推出其前后数组内容:
数组初始化:
0x00ECFBF4: 01 00 00 00
0x00ECFBF8: 02 00 00 00
0x00ECFBFC: 03 00 00 00
0x00ECFC00: 04 00 00 00
0x00ECFC04: 05 00 00 00
for循环完成之后的数组:
0x00ECFBF4: 00 00 00 00
0x00ECFBF8: 00 00 00 00
0x00ECFBFC: 03 00 00 00
0x00ECFC00: 04 00 00 00
0x00ECFC04: 05 00 00 00
故这里输出结果为 0 0 3 4 5,其实这里用数学知识都可以得出答案,一个整型需要4个字节,而short型指针一次for循环读取2个字节,共4次for循环,所以指针共指向(42/4=2)个0
2.如何避免指针成为野指针:
野指针指指针指向的内存不存在,或者内存没有值为一堆乱码,会造成程序出错,为了避免出现这种情况有以下5种方法:(1)赋给他一个空指针 eg: int* p=NULL;(2)初始化(3)避免指针超界(4)避免返回局部变量的地址(5)确保其有效性 eg:if (p!=NULL);
还有一个易忽略的点:当指针不使用时,把它赋成空指针,避免成为野指针,因为指针里面内容放0为空指针,禁止访问。
3.*表示指向或者解引用,不解引用就表示打出地址,解引用打出地址里的内容,&表示取地址或者按位操作符与,作用为是使两个二进制数,1遇1变1,1遇0变0,0遇0变0,这里不做过多解释。
我们这里所下这行代码:
int * a,*b;
int temp=0;
temp=*a;
- a=*b;
*b=temp;
这是一个简单的交换两个数字的简略代码,你是不是对*a=*b;有点迷茫
其实这里的两个*,赋值运算符左边的作用为指向,右边的为解引用,表示指针a指向指针b解引用地址的内容,你可以理解为一个快递员a去取快递员b在某个快递点取到的邮件里面的东西,
如果实在不好理解,就死记,指针a指向指针b指向的地址的内容
- 二级指针:int pa;int ppa=&pa;表示取pa的地址,指针本身就有地址,因为他为变量。二级指针指向指向地址的指针的地址。(n+1)级指针存放n级地址**ppa=20;表示解引用ppa,而*ppa等价于pa,所以出现多级指针这点希望大家们不要慌张要沉着冷静解题。
5.最后补充几点吧:(1)多级指针是存放前一级指针的地址(2)指针是可以比较大小的,因为其本身就有其地址(2)指针-指针的前提是两个指针都指向同一个空间 如:&a[9]-&a[11],其结果为-2,表示它们两个相差的元素个数。
版权归原作者 禾禾的博客日记 所有, 如有侵权,请联系我们删除。