首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言入门知识点(10.指针b篇)(超详细)

C语言入门知识点(10.指针b篇)(超详细)

作者头像
say-fall
发布2026-01-15 09:59:59
发布2026-01-15 09:59:59
840
举报

  • 🌈🌈🌈这里是say-fall分享,感兴趣欢迎互三
  • 🔥🔥🔥专栏:《C语言入门知识点》、《C语言底层》
  • 💪💪💪格言:今天多敲一行代码,明天少吃一份苦头

前言:

本篇主要是延续上一篇文章【指针a篇】的内容继续讲解指针的知识点,具体内容有:指针±整数有什么作用、什么是泛型指针、const对于其他变量和指针变量的作用,想了解这些内容的小可爱们快来看吧~ ~ ~

正文:

3. 指针变量类型的意义
3.1指针的解引用与指针变量大小的意义

先来看两段不同代码及其运行结果

  • 1.第一段
代码语言:javascript
复制
int main()
{
	int n = 0x11223344;
	int* pi = &n;
	*pi = 0;
	return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  • 2.第二段
代码语言:javascript
复制
int main()
{
	int n = 0x11223344;
	char* pc = (char*)&n;
	*pc = 0;
	return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

能看得出来在*pc=0的时候第一段代码修改了4个字节的值,全部修改为0,但是第二段代码只修改了1个字节。 这证明指针变量大小虽然相同,但是也是有一些不一样的地方的。

3.2 指针 ± 整数

我们直接来看一段代码,看一下指针如果加上整数或者减去整数会是什么效果

代码语言:javascript
复制
#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指的是无类型指针(也叫泛型指针)。那它有什么用呢?下面我们来看例子: 我们执行这样一段代码

代码语言:javascript
复制
int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	return 0;
}

结果发现他会报错

在这里插入图片描述
在这里插入图片描述

那这种情况下怎么办呢? 我们把 char 换为 void 试试看

这下子发现他不报错了

在这里插入图片描述
在这里插入图片描述

那我们懂了,可以用 void 来接收不同类型的指针 那 viod 可以进行指针运算吗? 答案是:NO!!!

代码语言:javascript
复制
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是干什么的呢?继续看一段代码

代码语言:javascript
复制
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;这一行注释掉看看:

代码语言:javascript
复制
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看一下效果
代码语言:javascript
复制
#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//指针指向的值
代码语言:javascript
复制
#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//指针本身
代码语言:javascript
复制
#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,看一下什么效果
代码语言:javascript
复制
#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来让指针各方面都变成 “只读” 状态。

本节完…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 正文:
    • 3. 指针变量类型的意义
    • 3.1指针的解引用与指针变量大小的意义
      • 3.2 指针 ± 整数
      • 3.3 void* pointer
    • 4. const 修饰指针
      • 4.1 const修饰变量
      • 4.2 const修饰指针变量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档