一.指针的一些基础知识
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函数指针数组
这个可以变相的理解成函数指针。