1、前言
指针是C语言的“精髓”,学C语言不学指针等同于C语言白学,这话语说的虽然直白,但是却真正体现出了指针在C语言中的重要性。
要想成为C语言方面的大佬,那你必须玩转指针,指针在C语言中的重要性不言而喻,但它也是我们入门C语言的拦路虎,很多大学的非计算机专业对C语言的讲述也都是到指针之前数字为止,很多人一提到指针头脑中就出现了一个字“难”,因为在生活中我们接收到的信息都在给我们灌输一个指针很难的思想,这种思想让不少C语言入门者对指针望而退步,困住他们的不是指针真的很难,而是他们自己认为指针很难这种惯性思维,从而让他们不敢轻易去尝试指针,但当我们真正静下心来,不被外界惯有思维干扰,去解剖分析理解指针,之后你会发现指针原来也就这样,真正难的是第一步,当年入门了之后,指针的大门就已经为你打开,你可以畅流在指针的海洋里。
2、指针是“什么”
2.1 存储
计算机的数据都存储在内存中,但当要使用需要的数据的时候,怎样才能在内存中找到相应的数据呢? 答案是通过内存的地址查找,在计算机中内存都有相应的地址编号,知道相应的地址就能取出对应地址中的数据,你可以在脑海中想象出这样一个画面,有一个地址表,这个地址表中的每一个地址都通过一个箭头指向一块内存。
“指针”,我们看到这个词脑海中的第一印象应该就是“想针一样的箭头指向一个地方”,是不是就与上面脑海中的图像中的箭头对于上了,我们最常听到的一句话关于指针的话就是“指针指一个地址”,但这句话也常常把人引入误区,让人只关心指针的指向,而未去理解指针的本身。
2.2 指针“真容”
要想理解指针,必须先理解指针它的本来面目是什么,而不是说起指针的第一印象就是“指针指向的是一个地址”、“指针存储的是一个地址”,当然这些说的都没错,但我们在入门的时候应该掀开这一面纱,去理解它的”真容“。
指针的“真容”是什么呢?我的答案是它是一块内存。
char a;
int b;
float c;
double d;
看到上面变量的定义,相信大家都能理解,通俗的话来讲就是,由于要存储数据类型的不同,我们通过不同的变量类型定义变量来存储相应的数据,但是在计算机底层中,这些不同变量的数据都是存储在一块块的内存中,区别只是对数据的处理方式以及内存的大小不同,他们实际上就是一块块的内存,通过变量名来与这些内存联系起来,通过这来看其实“变量名就指向相应的内存,通过变量名可以对相应的内存进行操作”,其实变量名可以看作特殊形式的地址,当然和真正的地址还是有很大的区别,变量名是编译器在处理,在这不做过多的讲述,有兴趣的可以自己去找相应的资料进行扩展。
char *ptr;
int *ptr;
float *ptr;
double *ptr;
上面是一些最常见的指针形式,指针同上面的基础类型一样,在计算机的底层中也是一块块的内存,同上面的那些基础类型内存一样存储的都是数据,只是指针对应的内存中存储的数据是其它内存的地址,通过这个地址可以对相应的内存中的数据进行操作,所以不要固有印象的认为“指针是一个地址”,其实指针也是一个变量,其有自己对应的内存,在内存中可以存储其它变量的地址,当然指针这块内存也有自己的地址编号,所以可以二级指针、三级指针进行套娃下去,既然指针也是一个变量,所以我们也可以通过改变里面的数据来使其指向不同的地址。
3、指针是一个“泛称”
指针是一个“泛称”,它不像int、char、float、double等等变量类型一样,有自己的专一的类型,指针的类型和它指向的地方相对应,它指向什么类型的数据就要定义成相应类型的指针,由于不同类型的数据所占内存的大小不同,所以其对应的指针移动时的大小不同。
我们要把指针自身类型和其指向类型区分开,不要把两者的概念进行混淆,下面的是一些最基础的指针类型的定义,理解了之后可以看看复杂的指针,比如二级指针、三级指针、指向数组的指针、指向函数的指针等等。
char *ptr;
指针类型未char *
指向char类型
int *ptr;
指针类型未int *
指向int类型
float *ptr;
指针类型未int *
指向float类型
double *ptr;
指针类型未int *
指向double类型
struct t *ptr;
指针类型未 struct t *
指向结构体t类型
4、“&”和“*”
&是取地址运算符,*是间接取值运算符。
在定义完指针之后,怎么把对应类型变量的地址赋值给指针呢?答案是通过&取地址运算符来取出相应变量得到地址。
char a;
char *prt;
prt = &a;
/*&a的结果未a的内存的地址*/
/*其它类型的数据和对应类型的指针也是相应的操作*/
定义了指针,也进行了相应的赋值,那要怎么通过指针去操作其所指向的数据呢?答案是通过间接取值运算符。
char a;
char *prt;
/*定义指针*/
prt = &a;
/*指针赋值*/
*prt = 'a';
/*通过指针操作指向的内存
上一条语句等同于a='a'*/
5、总结
本文介绍了一些指针的基础入门知识点,希望能对大家有帮助,如有错误,请大家评论指出,作者万分感谢。
(之后有空或者大家有需求,将写一些C语言指针的进阶,比如复杂指针的定义及分析、指针的算数运算、指针与数组等等内容)