`

关于指针

 
阅读更多

指针是什么?

    K&R中关于指针一词做如下解释:

         指针是一种保存变量地址的变量,在C中频繁地使用。

这种解释直接有把指针当做变量的意思,但是事实并非如此。

 

    经常说的指针实际上是指“指针类型”、“指针类型变量”、“指针类型的值”。

    像int a=5;一样,有“int类型”、“int类型变量”(a)、“int类型的值”(5)。

    “指针类型”是由其他类型派生的,也就是说,它包含“指向int的指针类型”、“指向double的指针类型”;

    “指针类型的值”在程序中实际上就是内存的地址。

#include <stdio.h>

int main()
{
	int hoge=5;
	int piyo=10;
	int *pHoge;

	/*输出每个变量的地址*/
	printf("&hoge...%p\n",&hoge);
	printf("&piyo...%p\n",&piyo);
	printf("&pHoge...%p\n",&pHoge);

	pHoge=&hoge;  //hoge的地址赋给pHoge
	printf("pHoge...%p\n",pHoge);
	printf("*pHoge...%d\n",*pHoge);
	*pHoge=10;  //通过pHoge修改hoge
	printf("hoge...%d\n",hoge);
}

 代码中,pHoge是指向int的指针变量,它取值为&hoge,&hoge是hoge的地址,也就是指针类型的值。

“*pHoge”表示指向该地址的变量,而hoge变量指向了这个地址,所以*pHoge等同于hoge。

 

指向int的指针类型与指向double的指针类型有区别吗?有,因为编译器会记住指针所指向的类型,这两张类型相互赋值时都会受到编译器的警告。在指针进行加N时,指针的值(内存地址)会增加“N*所指向类型的长度”。

 

空指针NULL是特殊的指针类型的值,它确保指针没有指向任何对象。NULL可以对任何类型的指针变量赋值。在 stdio.h里面定义为:#define NULL 0

另外,空字符'\0'实际上也是值为0的字符。

 

数组可以解读为指向它的初始元素的指针,p[i]是*(p+i)的简便写法,下标运算[]原本就是这种用法,它和数组无关。对于编译器,[]这样的运算完全可以不存在。

数组作为参数进行函数参数传递时,传递的是初始元素的指针。

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics