指针基础知识
要理解指针,可以将它们与普通变量进行比较。
“正常变量”是内存中可以保存值的位置。例如,当你声明一个变量我作为一个整数,为它预留了四个字节的内存。在程序中,通过名称来引用内存中的位置我.在机器级别上,该位置有一个内存地址。该地址的四个字节为程序员所知我,四个字节可以保存一个整数值。
广告
指针则不同。指针是一个变量点换到另一个变量。这意味着指针保存着另一个变量的内存地址。换句话说,指针不持有传统意义上的值;相反,它保存了另一个变量的地址。指针通过保存另一个变量地址的副本来“指向”该变量。
因为指针保存的是地址而不是值,所以它由两部分组成。指针本身保存地址。该地址指向一个值。这里有指针和所指向的值。在你适应之前,这个事实可能会让你有点困惑,但一旦你适应了,它就会变得非常强大。
下面的示例代码显示了一个典型的指针:18新利最新登入
#includeint main() {int i,j;int * p;/*指向整数的指针*/ p = &i;* p = 5;j =我;Printf ("%d %d %d\n", i, j, *p);返回0;}
该程序中的第一个声明声明了两个普通整数变量我而且j.这条线int * p声明一个名为p.这一行要求编译器声明一个变量p这是一个指针到一个整数。的*指示声明的是指针,而不是普通变量。您可以创建指向任何对象的指针:浮点数、结构型、char型等等。只要使用*表示需要指针而不是普通变量。
这条线P = &i;对你来说绝对是新的。在C语言中,&叫做地址运算符.表达式我表示“变量的内存地址我因此,就有了这样的表达P = &i;意思是“分配给”p地址:我一旦你执行了这个语句,p“点”我.在此之前,p包含一个随机的,未知的地址,它的使用可能会导致分割错误或类似的程序崩溃。
把正在发生的事情形象化的一个好方法是画一幅画。后我,j而且p宣布后,世界看起来就像上图。
在这幅图中有三个变量我,j而且p已经声明,但是三个都没有初始化。因此,这两个整数变量被绘制为包含问号的方框——在程序执行的这一点上,它们可以包含任何值。指针被画成一个圆,以区别于保存值的普通变量,随机箭头表示此时它可以指向任何地方。
行后p = &I;,p初始化和它指向我,像这样:
一次p指出我,内存位置我有两个名字。它仍然被称为我,但现在它被称为* p也这是C语言中谈论18新利最新登入指针变量的两部分:p位置是否包含地址,而* p该地址所指向的位置。因此* p = 5表示由指向的位置p应该设置为5,如下所示:
因为位置* p也我,我它的值也是5。因此,j =我;集j到5,和printf声明中产生5 5 5.
指针的主要特征是它的两部分性质。指针本身保存一个地址。指针还指向一个特定类型的值——该点所在地址的值。在这种情况下,指针本身是p.所指向的值为* p.