0


关于指针:

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指向的地址的内容

  1. 二级指针:int pa;int ppa=&pa;表示取pa的地址,指针本身就有地址,因为他为变量。二级指针指向指向地址的指针的地址。(n+1)级指针存放n级地址**ppa=20;表示解引用ppa,而*ppa等价于pa,所以出现多级指针这点希望大家们不要慌张要沉着冷静解题。

5.最后补充几点吧:(1)多级指针是存放前一级指针的地址(2)指针是可以比较大小的,因为其本身就有其地址(2)指针-指针的前提是两个指针都指向同一个空间 如:&a[9]-&a[11],其结果为-2,表示它们两个相差的元素个数。

标签: c语言 leetcode 链表

本文转载自: https://blog.csdn.net/Shape_of/article/details/123125450
版权归原作者 禾禾的博客日记 所有, 如有侵权,请联系我们删除。

“关于指针:”的评论:

还没有评论