指针浅薄之见

指针是C语言的灵魂,它让人欲哭无泪,让人咬牙切齿,但并不是不可打败的。

一:什么是指针

        我们可以把计算机的内存看做一个个房子,每个房子里可以存放数据,并拥有独一无二的门牌号。

     

        int a=100;

        由于a是整型变量,计算机开辟了四个字节的空间,让a指向这一空间,把100以二进制方式存入。这块空间独属于a,因此有了a的地址就可以找到a。

        指针作为实体,是一个用来保存一个内存地址的变量。

二:如何读懂指针语句

        我们直接开干:

int p;        定义了一个整型变量p

int *p ;        定义了一个(野)指针

int * p[5];        由于[]优先级高于*,p先和[]结合,说明p是一个数组,再与*结合,说明数组的元素类型为int * ,即数组p里面存放了5个指针,最后和int结合,说明指针指向的内容的数据类型为int,所以p是一个由指向整型数据的指针组成的数组

int (*p)[5];        由于*p有小括号,p先和*结合,说明p是一个指针,接着与[]结合,说明p指向的内容是数组,接着与int 结合,说明数组的元素类型为int,所以p是一个指向整型数组的指针

int *(*p)[5];        由于*p有小括号,p先和*结合,说明p是一个指针,接着与[]结合,说明p指向的内容是数组,接着与int *结合,说明数组的元素类型为int *,所以p是一个指向指针数组的指针

int (*p[5])[10];        由于[]优先级高于*,p先和[]结合,说明p是一个数组,数组有5个元素,我们把p[5]去掉,剩下的int (*)[10]是元素类型,说明数组里每个元素类型是数组指针,每个数组指针指向的内容是一个由10个元素组成的数组,元素类型为int,所以p是一个由指向数组的数组指针构成的数组

int * p();        由于()优先级高于*,所以p先和()结合,说明p是一个函数,函数的参数类型为void,返回值类型为指针,所以p是有个返回值类型为整型指针的无参函数

int (*p)();        p先和*结合,说明p是一个指针,指向一个函数,函数的参数类型为void,返回值类型为int,所以p是一个指向返回值类型为int的无参函数的指针

三:为什么会出现野指针

1.指针变量没有初始化

int *a;
*a = 18;

这里我们定义了一个指针变量a,并将18赋值到a所指向的内存。

但我们并不知道他究竟指向哪里,为什么?

因为我们没有对他进行初始化,指向的位置是随机的。

 也许是A1,也许是E2,我们不知道他去了哪一个房子存了18,所以结果是不可知的。

2.超出变量作用域

在数组里,加入一个数组Array有十个元素,我们用不了Array[10],因为越界了,数组的实质是指针,因而指针越界时,这个指针也无法正常使用。

四:指针的算术运算

指针 与 整数

我们将a,&a ,&a[0]打印出来,地址是一样的

说明数组是一种指针,数组名是数组的首地址,我们在对指针进行算术运算时,实际上就是从数组的一个元素移到另一个元素

比方说,我们对指针进行+3,则他从原来指向的位置向右平移3个元素,就是新的地址,当然要在不越界的情况下。

越界就一切都不好说啦~ 

猜你喜欢

转载自blog.csdn.net/m0_63742310/article/details/121973503