指针的理解

指针在C语言中是一个很重要的部分,并且应用比较广泛,在说指针数组、数组指针各种之前,要先明确指针是什么及其为何存在(也就是指针的作用)

1.指针和指针变量

我们都只知道,一个变量有它自己的存储空间和存储内容,而每个变量的存储空间在内存中是有编号的即对应相应的地址编号,而当我们需要使用某个变量的时候,可以根据其不同的地址来将其取出来然后调用,指针便是指向这个存储空间,故指针其实就是地址·。

指针变量  是一个变量,和其他的普通变量一样,它也有自己的存储空间和存储内容,只不过这里的存储内容和别的变量不一样,存的是一个地址。

int a = 10;
int * p = a;

2.指针数组

指针是一个类型,为“type +*”,那么数组也是一个类型,当两者结合时也是一种类型。

而指针数组其实就是一个数组,只不过其类型为指针,或者说其存放内容为一个个的指针。

int *arr[10];
char *p [20];

这两都是指针数组,下面是图,第二个数组也是一样的道理



3.数组指针

与指针数组一样的道理,数组指针其实就是一个指针,只不过这个指针指向的是一个大小为10个整型的数组

int (*p) [10];
char (*p) [8];

这两都是数组指针

4.函数指针

在理解函数指针之前,我们先来一段代码

void fun()
{
	printf("hello");
}

int main()
{
	printf("%p\n", fun);
	printf("%p\n", &fun);
}

运行结果:


由结果可以看出两地址是一样的,都是fun函数的地址;

而我们都知道,想要存放地址必须首先得是指针,下面是两个例子对比:

void (*pfun1) ();  //可以看出pfun1先和*结合,所以pfun1首先是一个指针,而这个指针指向一个函数,这个函数无参数,返回值类型为void,故 void (*pfun1) ()是一个函数指针,可以存放函数的地址

void *pfun2();  // 可以看出pfun2先和()结合,所以pfun2是一个函数名,而其返回值为void *,故不是一个指针(不是函数指针),所以不能存放函数的地址

5.函数指针数组

上面已经了解了了指针数组,那么把函数的地址存到一个数组中,那么这个数组就是函数指针数组

例如: 

int (*parr[10]) ();

就是一个函数指针数组:parr先和[10]结合成为一个数组,然后该数组的内容是 int (*) ()类型的函数指针


6.指向函数指针数组的指针 

指向函数指针数组的指针首先呢是一个指针,该指针指向一个数组,数组的元素都是函数指针

例如:  

void fun(const char *p)
{
	printf("%s\n", p);
}


int main()
{
	void (*pfun)(const char *) = fun;
	//函数指针pfun


	void (*pfunArr[5])(const char *p);
	pfunArr[0] = fun;
	//函数指针数组pfunArr
	void (*(ppfunArr[10])(const char *) = &pfunArr;
	//函数指针数组的指针ppfunArr或者说是指向函数指针数组pfunArr的指针ppfunArr
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ijn842/article/details/79647021
今日推荐