什么是指针?从根本上看,指针是一个值为内存地址的变量。 ——《C primer plus》 指针,一直都是C语言的重点。初学C的人可能只是知道,它是变量的地址,但却不知道,学这个变量的地址有什么用。指针的伟大之处其实并不在语言本身,而是在于它和结构体搭配产生的一种叫数据结构的东西。如链表队列栈,树图等。所以,虽然在现在指针用到的地方不多,但还是要好好掌握这个知识。 &和* 在我们之前有学到那么一个运算符是&取地址符,它的作用是返回变量的地址,我们现在要获取一个变量的地址,让它赋值给一个指针变量,可以这样子操作。 1inta=0; 2int*p=&a; 这样我们就把a的地址赋值给了p这个指针变量,注意指针变量是p而不是*p。上面也代表着p这个指针变量指向了a。如果你想声明double类型的指针就可以把上面两个都换成double。为什么都要换掉,去区分开不同类型的指针呢?每个指针变量的空间大小都是一样的,因为它只是储存地址,都是指针变量。既然用到的空间一样,那我们指针就指针呗,要区分int,double指针干嘛。这个问题我们留到下面指针的加法来讨论。 指针的存储 指针是按照16进制储存在指针变量中的,用%p对一个指针变量进行printf操作,可以得到指针的16进制地址。 这样子,就是把p所指的内容a赋值给了x。 1printf('%p',p); 指针的操作 对于* 这个运算符,用在声明的时候表示的是声明一个指针变量,就像上面那样。声明了一个int型的指针变量。 除了声明之外,用*对一个变量进行操作就可以对它地址上的内容,也就是这个指针所指的变量进行操作。如赋值: 1intx=*p; 这里我们就将p这个指针变量所指向的内容。如果p指向的是a变量,那么给x赋值的就是a的值。 解引用后的四则运算 1(*p)=(*p)+1; 为什么要括号呢,因为在这里我们可以更加直观的看出,是p指向的指针在进行加法而不是p这个指针变量在进行加法。 指针与一维数组 在上一篇的数组中,我们讲到了数组名是数组的地址,而在这篇文章中,我们又提到了指针是一个储存地址的变量,那这样的话,数组和指针是有关联的。 如果我们要数组第一个元素的地址,可以如下 1inta[10]; 2int*p=&a[0]; 如果我们要数组的地址,可以如下 1int*q=a; 我用%p打印出来出来后是下面这两个(不同机器的地址会和这里不一样) 1000000000065FE20 2000000000065FE20 虽然它们的地址是一样的,但是这两个指针的类型是不一样的,第一个指的是数组的第一个元素的地址,第二个指的是整个数组的地址。 指针+整数 当给指针加上整数的时候,因为指针指的是地址,所以当我们用指针加整数的时候就是原来的地址加上指针类型*要加的整数。 就拿一个小区来说,每个房子之间的距离是4米(模拟int的字节数)。如有一家的门牌号是3。你给地址加一个数字,它的地址会加上4乘上这个小区的房子距离。就会是第4个门牌号的房子的地址。 如果你在另一个小区,房子间的距离比较大了,为8米(模拟double的字节)。也是假如有一家的门牌号是3。你给地址加一个数字,那么这个时候,给地址加上的应该是这个小区的房子距离8乘以加的数字。才可以得到准确的房子地址。 这就为什么我们要区分不同的指针类似了。在两个小区中,计算一开始的地址都是3,但是因为小区的房子间距不一样,所以它们需要加的那个数字就会因为这个距离而变化,不只是看这个整数。 举一个数组和指针的例子 1inta[10]; 2printf('%d',*(a+3)); 以上会打印出a[3]这个变量,因为我们在解引用前先对指针+3,让它移动到了a[3]的位置。给他解引用后就是a[3]的值了。 指针减整数 这个指针减去整数就和上面的指针加整数差不多,就是减去指针类型*要减的整数。要注意的是当它用在数组名上时,不要让指针指在数组外面。 指针减指针 可以想一下,当两个门牌号相减的时候会得到什么?是两个房子的门牌号之差,而不是两个房子的距离。这里要注意的是,指针减指针一般是用在数组中,例如 1inta[10] 2intx=&a[3]-&a[0]; 这就是指针的一些基本知识了,关于二维数组用指针表示,这里不多写了。如果你觉得不懂这二维数组和指针的关系的话,或者对于文章内容有什么建议,可以关注我,我来替你解答! “全球最大的C/C++人员聚集地就在我这里,企鹅裙馊直播编程学习,【14】就是我的。不管你是什么基础,来了就是兄弟,是兄弟就跟我一起学习C/C++!关注我,为编程点赞,每天学点小知识!工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我学习,技术大牛、学习资料等助你早日成为一名优秀的程序员! |
|