本篇主要是延续上一篇文章【指针a篇】的内容继续讲解指针的知识点,具体内容有:指针±整数有什么作用、什么是泛型指针、const对于其他变量和指针变量的作用,想了解这些内容的小可爱们快来看吧~ ~ ~
先来看两段不同代码及其运行结果
int main()
{
int n = 0x11223344;
int* pi = &n;
*pi = 0;
return 0;
}

int main()
{
int n = 0x11223344;
char* pc = (char*)&n;
*pc = 0;
return 0;
}

能看得出来在*pc=0的时候第一段代码修改了4个字节的值,全部修改为0,但是第二段代码只修改了1个字节。 这证明指针变量大小虽然相同,但是也是有一些不一样的地方的。
我们直接来看一段代码,看一下指针如果加上整数或者减去整数会是什么效果
#include <stdio.h>
int main()
{
int n = 10;
int* pi = &n;
char* pc = (char*)&n;
printf("%p\n", &n);
printf("%p\n", pi);
printf("%p\n", pc);
printf("%p\n", pi+1);
printf("%p\n", pc+1);
}以下为运行结果:

我们可以看到:&n、pi、pc对于指针来说其实是等价的;但是对于pi+1和pc+1来说,他们则是完全不同的。
像是这个代码,int类型的就+4个字节,char类型的就 + 1个字节
事实上,当一个指针 ± 整数 n 时,实际上的书写应该是 pointer ± n*sizeof(----),----代表变量类型,也就是说,对应 ± 几个字节是由变量类型决定的。
对于void,我们已经很熟悉了,代表的是空类型的意思,在指针这里同样也是这个意思,void* pointer指的是无类型指针(也叫泛型指针)。那它有什么用呢?下面我们来看例子: 我们执行这样一段代码
int main()
{
int a = 10;
int* pa = &a;
char* pc = &a;
return 0;
}结果发现他会报错

那这种情况下怎么办呢? 我们把 char 换为 void 试试看
这下子发现他不报错了

那我们懂了,可以用 void 来接收不同类型的指针 那 viod 可以进行指针运算吗? 答案是:NO!!!
int main()
{
int a = 10;
int* pa = &a;
void* pc = &a;
*pa = 15;
*pc = 20;
return 0;
}运行结果

所以我们得到结论:
那他在那里会用到呢?具体是做什么呢?我们在后面的指针篇中了解。
const是干什么的呢?继续看一段代码
int main()
{
int a = 2;
const int b = 3;
a = 11;
printf("%d ",a);
int* pa = &a;
*pa = 12;
printf("%d ",*pa);
b = 13;
printf("%d ",b);
int* pb = &b;
*pb = 14;
printf("%d ",*pb);
}
}报错了

能看得出来,const的作用简单来说:就是对所修饰的的变量做一些限制,让它变成一个常变量。
我们把b = 13;这一行注释掉看看:
int main()
{
int a = 2;
const int b = 3;
a = 11;
printf("%d ",a);
int* pa = &a;
*pa = 12;
printf("%d ",*pa);
//b = 13;
printf("%d ",b);
int* pb = &b;
*pb = 14;
printf("%d ",*pb);
}运行结果

我们发现,他只是对b做了限制,而没有对pb的指针操作作出限制。
如果要限制这个值不能被更改,那就让他也不能通过指针的方式修改,下面我们来了解。
和上面一样,我们把const放在指针变量的前面,还是前面的例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 2;
const int b = 3;
a = 11;
printf("%d ", a);
int* pa = &a;
*pa = 12;
printf("%d ", *pa);
//b = 13;
printf("%d ", b);
int* pb = &b;
*pb = 14;
printf("%d ", *pb);
pb = &a;
printf("%p ", pb);
}运行结果:

const int* pb = &b;然后试图修改*pb//指针指向的值#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 2;
const int b = 3;
a = 11;
printf("%d ", a);
int* pa = &a;
*pa = 12;
printf("%d ", *pa);
//b = 13;
printf("%d ", b);
const int* pb = &b;
*pb = 14;
printf("%d ", *pb);
/*int* const pb = &b;
pb = &a;
printf("%p ", pb);*/
}结果是这样的:

int* const pb = &b;,然后试图修改pb//指针本身#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 2;
const int b = 3;
a = 11;
printf("%d ", a);
int* pa = &a;
*pa = 12;
printf("%d ", *pa);
//b = 13;
printf("%d ", b);
/*const int* pb = &b;
*pb = 14;
printf("%d ", *pb);*/
int* const pb = &b;
pb = &a;
printf("%p ", pb);
}结果是这样的:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 2;
const int b = 3;
a = 11;
printf("%d ", a);
int* pa = &a;
*pa = 12;
printf("%d ", *pa);
printf("%p ", pa);
//b = 13;
printf("%d ", b);
const int* const pb = &b;
*pb = 14;
printf("%d ", *pb);
pb = &a;
printf("%p ", pb);
}结果是这样的:

通过上面四个例子就能看出来:
本节完…