对C语言指针的理解~
之前,刚刚学习C语言的时候,学习其它数据类型的时候,感觉很好理解,但是学到指针的时候,笔者就蒙蔽了,因为看到课本上的文字,云里雾里的,什么指针,什么指针变量,对于笔者来说都是傻傻分不清,感觉指针和指针变量好像一样,或者试图去背下来,但是老是搞混。那时候不知道,我的心思是在忙于社团工作,还是在哪个漂亮女孩身上,反正就是没好好学习,所以直到现在,在学习了计算机原理之后,重新打开C语言的课本(ps不是和原来的那本一样的,是疫情前,我在学校图书馆随便借的),重新看了指针的定义之后,突然豁然开朗。
其意思应该是这样。首先,你要明白什么是变量,变量其实就是内存存储单元的一个别名,而地址才是这个存储单元的真实名称。
对于电脑来说,所有数据都存在内存当中,每一个内存都有一个独一无二的编号,在不同作用域下,可以有相同的变量名,但是,在电脑中,相同变量名的地址却是不相同的。这就好比,在我们中国,叫李明的人很多,李明这个名称相当于变量名,但是每个李明的身份证号却是独一无二的,这个身份证号就相当于内存地址。
而且计算机,只能通过地址来寻找内存单元,进而对这个内存单元的数据进行运算,我们使用这些语言的人,为了方便,不可能直接用一个内存地址去存放一个数据,所以聪明的先辈们模拟现实世界,人名与身份证号这个关系,而创造了变量。
首先,我们在使用变量进行运算的时候,计算机会把这个变量名翻译成内存地址,比如0X00427C5D,然后根据这个地址所存储的变量数据,进行运算。
在明白了变量的作用之后,在说一下C语言的其它数据类型,int:整型,float:单精度浮点型,double:双精度浮点型,等等……我觉得初学者在学习这些数据类型的时候,应该不难理解,因为它们所表示的类型,和我们一直以来所接受的教育学到的数据类型,比如数学上的100,100.5,5.5,6.66666,这些都一样,我们自然而然的很容易接受。
所以在学习这些int型变量,float型变量,double型变量所保存的数据,进行运算的时候,我们很容易就使用它们,写出一个实现加法,减法这些小程序,可是有些人在学习到指针就犯傻了。原因有很多,第一,可能是教学的老师,在讲解指针的时候,过于圣神化指针这玩意,把它说的很难,第二可能是像用地址保存数据这些观念没办法很好的理解,这些人有时候得学到计算机原理的一些知识才可能明白,比如我,哈哈哈……
现在开始正文:
1.指针
什么是指针,其实指针就是地址,在我们这些语言的使用者,在定义一个变量的时候,系统就会把这个变量的地址给翻译出来,这个变量的地址就是指针,指针就指向了这个变量.
int a = 10;
像上面这个式子,a就代表10,系统会给a随机分配一个内存地址,这个地址就叫做指针。
2.指针变量
什么是指针变量,其实指针变量,和其它一些数据类型的变量的意义都意义,比如整型变量,浮点型变量,这些变量都是来保存数据的,那么指针变量也是和它们一样,也是来保存数据的,只不过不同类型的变量保存不同的数据,比如 int a = 10, char a = 'c'。所以C语言也给指针变量一个保存具体类型的数据,指针变量保存的都是内存地址。
课本上这样表明指针变量的意义:指针变量必须依托它所指向的变量,才能有实际意义。为了表示指针变量和它所指向的变量之间的关系,C语言中使用 * 来表示这种指向。例如下例子:
int i = 0; int * p = i;
以上的语句,表示了指针变量p指向了一个变量 i,而*p就表示p所指向的变量,也就是*p = i =0,上面可以说很直观了,因为它直接就把 i 赋值给 *p 了,所以 *p 就等于 i ,那么p表示什么呢,其实就是 i 的地址, & i。(&是取址符)
指针是存放变量地址的,那么指针可以存放很多种类型的变量,所以指针定义的语法如下:
类型说明符 * 指针变量名
类型说明符可以是很多种数据类型,比如 int ,char ,double ,float,char,这些等等……
给大家一个小技巧,如果看到这里,对于如何拿到指针所保存的数据还有疑问的同学,你可以直接这样看待指针,指针的 * 和 & 是互为逆运算的,比如下面例子:
int i = 10; int *p = i; 那么 p 与 &i 就相等; 而*p = i; 那么 *p = *& i = i;
如果希望改变指针所指向的内容,可以采用取地址符 “&”直接赋值其它变量的地址,例如:
int i = 10; int j = 10; int *p = i ; //此时 p = &i; p = &j;//此时p = &j,*p = j
笔记就记录到这里。
总结:
1.其实指针就是内存地址,确切的说指针表示一个变量的内存地址;
2.指针变量是保存指针的,也就是指针变量保存的是一个变量的内存地址。
3.指针变量的语法格式 int *p = 3;char *p = 'c',float * p = '6.6' ,double * p = '6.666',等等这些;
4.指针变量和int 型变量 ,float型变量,char型变量实质是同一类,只不过保存着不同类型的数据。例子:int ---->6;float---->6.6,double----->6.666;char----->'c';int * ------>'0X00427CD'