- 🌈🌈🌈这里是say-fall分享,感兴趣欢迎互三
- 🔥🔥🔥专栏:《C语言入门知识点》、《C语言底层》
- 💪💪💪格言:今天多敲一行代码,明天少吃一份苦头
前言:
本篇主要是延续上一篇文章【指针a篇】的内容继续讲解指针的知识点,具体内容有:指针±整数有什么作用、什么是泛型指针、const对于其他变量和指针变量的作用,想了解这些内容的小可爱们快来看吧~ ~ ~
文章目录
正文:
3. 指针变量类型的意义
3.1指针的解引用与指针变量大小的意义
先来看两段不同代码及其运行结果
- 1.第一段
int main()
{
int n = 0x11223344;
int* pi = &n;
*pi = 0;
return 0;
}


- 2.第二段
int main()
{
int n = 0x11223344;
char* pc = (char*)&n;
*pc = 0;
return 0;
}


能看得出来在*pc=0的时候第一段代码修改了4个字节的值,全部修改为0,但是第二段代码只修改了1个字节。
这证明指针变量大小虽然相同,但是也是有一些不一样的地方的。
3.2 指针 ± 整数
我们直接来看一段代码,看一下指针如果加上整数或者减去整数会是什么效果
#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(----),----代表变量类型,也就是说,对应 ± 几个字节是由变量类型决定的。
3.3 void* pointer
对于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;
}
运行结果
所以我们得到结论:
- void* pointer 可以用来接收指针变量,但是不能用来做指针运算。
那他在那里会用到呢?具体是做什么呢?我们在后面的指针篇中了解。
4. const 修饰指针
4.1 const修饰变量
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的指针操作作出限制。
如果要限制这个值不能被更改,那就让他也不能通过指针的方式修改,下面我们来了解。
4.2 const修饰指针变量
和上面一样,我们把const放在指针变量的前面,还是前面的例子:
- 我们先不加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的左边:
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);*/
}
结果是这样的:
- 我们再将const放到int* 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);
}
结果是这样的:
- 最后我们再int*两边都加上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);
printf("%p ", pa);
//b = 13;
printf("%d ", b);
const int* const pb = &b;
*pb = 14;
printf("%d ", *pb);
pb = &a;
printf("%p ", pb);
}
结果是这样的:
通过上面四个例子就能看出来:
- const限定的是它右边的东西;
- 如果在int*的左边的话,它修饰的是指针指向的值,也就是限制 *pointer 被修改,而不限制 pointer 这个指针被修改,它依旧可以修改自己本身的值,也就是地址;
- 如果在int*的右边的话,它修饰的是自己本身的值,也就是限制 pointer 这个指针被修改,而不限制 *pointer 被修改,它依旧可以修改指针指向的值,即该地址存放的值。
- 我们可以通过添加两个const来让指针各方面都变成 “只读” 状态。
本节完…










3330

被折叠的 条评论
为什么被折叠?



