目录
在前面我已经对指针进行了一个粗略的介绍,包括指针的概念,定义,引用以及简单的计算,接下来我将进一步对指针进行研究说明,这样可以对指针的理解更为透彻。
NULL指针
NULL(空),这种类型的指针变量较为特殊,表明不指向任何东西。在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。而NULL指针也能表示某个特定的指针目前并未指向任何东西。比如用于一个在数组中寻找某个特定值的函数可能返回一个指向查找到的数组元素的指针。如果该数组不包含指定条件的值,函数就返回一个NULL指针。
#include <stdio.h>
int main()
{
int *p=NULL;
printf("p的地址为:%p\n",p);
return 0;
}
当代码被编译并执行后,其结果为:
p的地址为:0x0
在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。
指针数组和数组指针
这2个名称就是换了一个位置,但他们是有很大的区别。想要区分它们,就只需要在他们之间加一个“的”字。
指针数组:指针的数组,是一个数组,装着指针的数组
数组指针:数组的指针,是一个指针,指向数组的指针
'()','*','[]'三者的优先级是()>[]>*,所以,我们就可以很好的理解以下代码:
int (* p1)[5]; //数组指针
int *p2[5]; //指针数组
先看第一个语句,由于()优先级最高,所以先看括号里面的,显然是p1是一个指针,指向一个一维数组,数组长度为5,这就是数组的指针;第二个语句:先看[ ],是一个数组标志,再看*,说明数组的元素是指针类型,一个5个元素,这就是指针数组,搞清优先级,就很容易区分。
比如我们想要用一个指向字符的指针数组来存储一个字符串列表,如下:
#include <stdio.h>
int main()
{
const int k=4;
const char *names[]={
"zhangsan",
"lisi",
"wangwu",
"linliu",
};
for(int i=0;i<4;i++)
{
printf("第[%d]号的姓名是:%s\n",i,names[i]);
}
return 0;
}
其输出结果为:
指向指针的指针 :
比如有以下代码:
int a=10;
int *p1;
int *p2;
p1=&a;
p2=&p1;
其图解为:
接下来举一个实例:
#include <stdio.h>
int main()
{
int a;
int *p1;
int **p2;
a=100;
p1=&a; //获取a的地址
p2=&p1; //使用&获取p1的地址
printf("var=%d\n",v);
printf("p1=%p\n",p1);
printf("*p1=%d\n",*p1);
printf("p2=%p\n",p2);
printf("*p2=%d\n",*p2);
return 0;
}
其输出结果为:
var = 100 Pt1 = 0x7ffee2d5e8d8 *Pt1 = 100 Pt2 = 0x7ffee2d5e8d0 **Pt2 = 100
指向指针的指针是一种多级间接寻址的方式,我们可以把指针看作是找地址开门寻物的操作,而‘*’就是这个动作重复的次数,ptr是这个门牌号也就是地址值:
*ptr是完成一次开门取物的操作取出来的东西。
**ptr 是完成两次开门取物.需要注意的是第一次取得的是第二次要开的门的门牌号或者说地址,然后根据门牌号继续开门取物。 所以 *ptr 或者 **ptr 一定是取出来的东西,即为数值。而 ptr 一定是门牌号,即为地址值。
以上就是关于指针的另一部分知识,后面还会有最后一篇文章来介绍指针的内容,敬请期待,一键三连哟!