指针————又爱又恨的玩意

一.指针的一些基础知识

1.1指针的定义

指针指针,就像它名字说的那样,它肯定指向某个东西。经过前面的学习,我们知道变量的开辟会伴随着地址的重新开辟,这就意味着每一个变量在内存中都有着属于自己的地址。所以呀,指针就是要指向地址的。

1.2指针变量

我们已知取地址操作符&,那么我们是否可以用一个变量存放一个地址吗?显然是可以的,我们这里就要用到指针变量。

int a=10;
int * p = &a;

这样的话,p就是一个指针变量。那么我们应该怎么理解这个形式呢?

*是在说明p是指针变量,而前面的int是在说明p指向的是int型的对象。

1.3解引用操作符

很明显,当我们获取到一个地址的时候,我们不能单纯的使用地址,因为我们可能会使用里面的值,所以我们引入解引用操作符‘*’。

当一个指针变量加上解引用操作符的时候,我们就访问到了这个地址指向的具体的值。

注:指针变量的大小只与机器自身有关,与变量的种类无关(比如说,x64上是8个字节大小,x32是4个字节大小)

二.指针的运算

2.1指针加减整数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int i = 0;
	int sz = sizeof(a) / sizeof(a[0]);
	int* p = &a;
	for (i = 0; i < sz; i++)
	{
		//printf("%d ", *(p + i));
		printf("%d ", *p);
		p = p + 1; //指针加1
		//p++;
	}
//指针 - 整数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int i = 0;
	int sz = sizeof(a) / sizeof(a[0]);
	int* p = &a[9]; //p指针指向数组a第九个元素
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *p);
		p = p - 1; //p指针-1
	}
	return 0;
}

2.2指针减指针

计算的是两者之间元素的个数

int main()
{
	int a[6] = { 1, 2, 3, 4, 5, 6 };
	printf("%d\n", &a[6] - &a[0]);
	/*int* p = &a[6]-&a[0];
	printf("%d\n", p);*/
	
	return 0;
}

2.3指针关系运算

只有同一个数组中的元素才能相互比较

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define LONG 5
 
int main()
{
	int a[LONG] = { 0 };
	int* vp;
	for (vp = &a[LONG]; vp > &a[0];)
	{
		*--vp=1;//先将指针vp-1,再解引用vp的值再赋值为1
		
	}
	
	return 0;
}

三.指针的类型

3.1指针数组

很明显,这是一个数组,一个存放指针的数组

int * arr[5]

3.2数组指针

所以,这个很明显是存放数组的指针的变量

int (*P)[10];

10表示的是指向的数组的元素的个数

3.3函数指针

这里给大家科普一下,函数名其实就是函数的地址,但是为了明显,希望大家还是利用&表示

3.4函数指针数组

这个可以变相的理解成函数指针。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由永远自由

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值