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

  • 🌈🌈🌈这里是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来让指针各方面都变成 “只读” 状态。

本节完…

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值