c语言指针探秘

今天写AVL树的时候突然出了个bug,死活找不出来,后来百度了一下发现是用指针传当形参的时候指针指向的内容不会变化的,有点类似于直接传值,所以打算好好总结一下c语言指针的知识。

首先,我们一起来看一下指针的基本知识

int main()
{
	int *p;
	int a = 666;
	p = &a;
	printf("指针的占用内存大小为:%d字节\n", sizeof(p));
	printf("指针本身的地址为:%x\n", &p);
	printf("指针的内容为:%x\n", p);
	printf("变量a的地址为:%x\n", &a);
	return 0;
}

其结果为

也就是说当我们申请一个指针变量的时候要带*,将指针指向变量的时候我们要用&来取变量的地址

占用4个字节内存的指针有32位,假如内存是以字节编制的话那么指针可以索引约4GB的内存空间

接着谈指向指针的指针

指向指针的指针用**表示,也就是说有两级内容,第一级内容是指向的指针的内存地址,然后再是那个指针内存的内容指向的内存地址,可以把* 看成是一个将该变量内存里存的值作为索引得到的内存空间的值,比如变量a存放的是0x0001,那么然后地址为1的内存存放的数是666,那么*a得到的便是666

int main()
{
	int **p;
	int *t;
	int a = 666;
	t = &a;
	p = &t;
	printf("指针t内存空间本身的内容是:%x\n", t);
	printf("变量a的地址是:%x\n", &a);
	printf("指针p最终指向的内容是:%d\n", **p);
	//**p也可以看成 *(&t),即t这个地址的内存空间指向的内存空间的值
	printf("指针t的地址是:%x\n", &t);
	printf("指针p指向的地址是:%x\n", p);
	printf("*p所表示的内容是:%x\n", *p);
	return 0;
}

其结果为:

最后来看如果要在函数中改变指针指向的内容该怎么写

如果用指针的话,可以改变指针指向的内存单元的值,但是没法改变指针的指向

void test(int *i) {
	*i = *i + 666;
	i += 1;
}

int main()
{
	int a[] = { 666,888 };
	int *p = a;
	printf("指针p指向的内容为:%d\n", *p);
	printf("指针p本身的内容为:%x\n", p);
	test(p);
	printf("此时指针p指向的内容为:%d\n", *p);
	printf("指针p本身的内容为:%x\n", p);
	p += 1;
	printf("加1后指针p的内容为:%d\n", *p);
	printf("加1后指针p本身的内容为:%x\n", p);
	return 0;
}

运行结果为

但是如果用指向指针的指针那么就可以改变指针的指向了

void test(int **i) {
	**i += 666;
	*i += 1;
}

int main()
{
	int a[] = { 666,888 };
	int *p = a;
	printf("指针p指向的内容:%d\n", *p);
	test(&p);
	printf("此时指针p指向的内容:%d\n", *p);
	return 0;
}

其结果为

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/82961891
今日推荐