C——指针

最近把指针看了一下,谈一谈我对指针的理解,哪里有误,还请多多指教。

指针是什么?
根据我的理解,指针就是一个保存其他变量地址的地方,通过对指针的解引用*,我们就可以找到这个变量。
可以这么理解,我要去住酒店,我需要根据房间号去找到这个房间,房间号就是地址,房间就是变量,我可以同过房间号找到房间,那么同样的,我也可以通过指针找到我需要的变量。
指针的类型
我现在知道的数据类型有这么几种 int、short、char、long、long long、float、double。
那么指针也是有这几种类型的,不过指针创建时需要加*:

	int * p=NULL;
	char * q=NULL;
	short * s=NULL;
	float* f = NULL;
	……

至于我为什么要给指针赋值为NULL,因为暂时不用嘛,不然天知道天会指到那里去。
不管是什么类型的指针,在32位机器上统一占4个字节,在64位机器上统一占8个字节。通过下面的例子,我们可以看一下:

	int * p=NULL;
	char * q=NULL;
	short * s=NULL;
	float* f = NULL;
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(q));
	printf("%d\n", sizeof(s));
	printf("%d\n", sizeof(f));

32位运行结果:
在这里插入图片描述
由于我使用的vs2013我调到64位之后老是出错,64位机器的结果大家可以自己去看一下。
指针的类型决定了指针解引用时会访问几个字节的内存,是char则只访问一个字节,int就是4个字节……

指针运算

指针加整数
指针的运算也不是很复杂,指针的数字加减n代表该指针向前或向后走 n*指针类型个字节。 假设我们有一个指针是这样的,指向一个数组的首元素,指针加1,则指向下一个元素,通过例子可以看一下:
	int  a[5] = { 1, 2, 3, 4, 5 };
	int * p = &a[0];
	p ++;
	printf("%d\n", *p);

结果:
在这里插入图片描述

指针减指针
这没啥意思,减出来的结果就是两个指针间的元素的个数。
	int  a[5] = { 1, 2, 3, 4, 5 };
	int * p = &a[0];
	int *q = &a[4];
	printf("%d\n", q-p);

结果:
在这里插入图片描述

指针和数组
在刚开始学习指针的时候,我总以为指针就是数组(哈哈哈),毕竟数组的好些操作指针都能完成。然后又看了一下概念,发现这根本就是两个东西,我的想法太SB了。我们来看一下数组和指针的定义就明白了:
数组:一组相同类型的元素的集合
指针:一个存放其他变量地址的变量

这明显不一样嘛,一个存放的是数据,一个是存放的是地址,八竿子打不着的事情。
虽然指针不是数组,但是通过指针可以使用数组中的元素,并修改它们的值。我们都知道,数组名是数组首元素的地址,那么当一个指针存放的是某个数组名时,对之这个指针进行解引用就可以得到该数组的首元素,然后想怎么玩就怎么玩。

	int  a[5] = { 1, 2, 3, 4, 5 };
	int * p = a;
	printf("%d\n%d\n", *p,a[0]);
	*p=*p+1;
	printf("%d\n%d\n", *p, a[0]);

运行结果:
在这里插入图片描述
我们还可以通过指针,打印数组……好多操作。
除此之外,还有指针数组,数组指针,这两个东西我现在还比较懵,不是很懂,轻描淡写一点吧。

指针数组:本质上它还是一个数组,只不过数组的元素全部是指针。
数组指针:它是一个指针,指向一个数组,既然是指针那么在32位机器上也是占4个字节的。
如何创建指针数组和数组指针:

	int*  a[5];//指针数组
	int   (*b) [5];//数组指针

我们知道[]的优先级比“*”高,在这里a先和[]结合构成一个数组,然后才与“*”结合构成指针,这里int 表示指针的类型是整型。
在第二个中,()的优先级比[]高,所以b先和“*”结合形成指针,然后与[]结合构成数组指针,int修饰的是数组的内容,这里的数组是一个匿名数组,没有名字。
吧啦吧啦说了这么一堆,我也不知道我说了个啥,毕竟刚接触这俩玩意儿,还没怎么使用,估计再过个好多天(哈哈哈),写的多了用的多了我就会懂了吧。

关于函数指针
最后还有一些关于函数指针的东西,我更是看的一脸懵逼,只知道函数名就是该函数的地址,然后可以通过函数名调用该函数,但是传的参数的类型必须与该函数的参数类型相同,不然就有问题。 我知道的函数指针的用法:
int sum(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 5;
	int b = 6;
	int ret = 0;
	int(*p)(int x, int y);
	p = sum;
	ret=p(a, b);
	printf("%d\n", ret);
	return 0;
}

结果:
在这里插入图片描述
写出这段代码我感觉我已经黔驴技穷,不行了,山水有相逢,咱们下次见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值