C语言-入门级别指针详解带你快速了解指针

写在前面

指针是C语言的核心部分,可以说的C语言的灵魂所在。由于内容有一点点多,故此会分为上下两篇发布。这次Yu同学给大家带来的是初识指针上篇,让大家浅显的了解一下指针的一些知识。

开始之前说明一下什么是地址:

内存可以看成大量的小空间,每一个小空间都会有一个编号,而这个编号我们称之为地址。


1.指针与指针变量

1.1 变量在内存中的储存

在程序钟定义了一个变量a,则在编译时系统就会在内存中给变量a分配一个地址,这个变量的地址就称为该变量的指针
在这里插入图片描述

1.2 指针变量的概念

指针变量: 一个变量的内容是另一个变量的地址。
如果一个变量包含了另一个变量的地址,则称为第一个变量指向第二个变量的地址。

在这里插入图片描述
总结:指针是地址,指针变量是存放地址的变量(平常我们说的指针通常情况下是指针变量,大家了解下就行了)。


2.指针变量

2.1 指针变量的声明

数据类型 * 变量名;

这是声明当然也可以直接初始化,形式如下:

数据类型 *变量名=& 变量;

数据类型:指针指向的变量的数据类型,如:char *类型的指针是为了存放 char 类型变量的地址。

“ * ”符号:表示该变量是指针变量

注:变量名是不带*的,变量的类型是 数据类型 *。

代码:

int a=0;//声明一个变量
int *poniter=&a; //将a的地址放到pointer中

2.2 取地址运算符和解引用运算符

  • 取地址运算符
    取地址运算符符号为“ & ”,作用是获取变量的地址。
    如:pointer=&a;就是把a的地址赋值给pointer变量。

  • 解引用运算符
    解引用运算符符号为“ * ”,作用是返回一个地址中存储的数据。
    如:

int main()
{
   int a;
   int* p = &a;//这里的*不是解引用运算符,只是一个标志
   //这里是把a的地址放到指针变量p中
   printf("%d\n", a);    		//打印a的值
   printf("%p\n", &a);   		//打印a的地址    
   printf("%d\n", *&a);			//打印a的地址所储存的值(就是a自己)
   printf("%p\n", p);			//打印p中的值
   printf("%p\n", &p);			//打印p的地址

}

结果如下:
在这里插入图片描述

2.3通过指针来更改变量的值

这是指针基本的用法,其实就是用*和&这两运算符完成的,跟上面讲的又一点点重复,这里就用代码给大家讲解一下简单的例子:

int main()
{
	int a = 0;
	int* p = &a;
	*p = 3;         
	printf("a=%d\n", a);    
	printf("*p=%d\n", *p);
	return 0;
}

在这里插入图片描述
这里并没有对a直接赋值但却改变了a的值关键语句是*p=3;,其中p=&a,故*p=3等价于 *(&a)=3,就是a=3的意思。


3.指针运算

前面讲过指针是地址,而地址是十六进制的整数,是整形那就可以运算,这里给大家介绍一下指针的运算。

3.1指针与整数间的运算

指针与整数的相加是地址与整数相加,可以整数的大小来确定地址的变化量。

代码举例:

int main()
{
	int a = 0;
	int* p = &a;
	printf("更改前:\n");
	printf( "  p 的值(16进制的形式)=%p\n", p);
	printf("  p 中地址所对应的值(10进制)=%d\n", *p);
	printf("  p 自己的地址(16进制)=%p\n", &p);

	p = p + 1;
	printf("更改后:\n");
	printf("  p 的值(16进制的形式)=%p\n", p);
	printf("  p 中地址所对应的值(10进制)=%d\n", *p);
	printf("  p 自己的地址(16进制)=%p\n", &p);

}

在这里插入图片描述
我们可以看到p只加了1就出现了以上的差别,下面我们来一个一个的看:

  • p中的值(这个值是a的地址)由0076FCEO 变成了0076FCE4,大小增加了4。
    系统中每一块内存都有一个地址,这一小块的内存大小是 1 字节,这里加的1是整形,也就是说p+1的地址在p的后面4个。 (跟加的变量的数据类型有关,比如如果加的是char型,则没增加一个单位地址增加2)
    在这里插入图片描述
  • 指针变量指向变量的值的大小
    上面p中地址对应的值(这里就是a)为0,而p+1指向的值却是-858993460,这个值的大小是随机数,因为道地址之间的差和地址中的值是没有啥关系的。

3.2指针间的运算

其实这点和第一点几乎是一样的。指针是地址,而地址是一个整形,指针间的运算就相当于指针和整形运算,唯一的区别的指针指向的是一个已经确定的随机数,这时候相加就没太大意义。


4.野指针

野指针是指指针指向的地址是未知的,既可能是指向已近使用的空间又有可能指向已近使用的空间,野指针一般引出大问题的是后者,因为指正是可以略过变量名之间改变变量中的值 ,比如你写的一个野指针修改的值刚好是switch()中的整形变量,那这一部分的功能就都会失效。

总结:

本次Yu同学给大家介绍了指针的概念,声明方法,简单解释了指针的使用方式和原理,希望能帮助大家快速了解指针.

写在最后

在这里插入图片描述
非常感谢大伙们的耐心阅读(如果内容还可以的话能不能给个小心心鼓励一下YU同学),如果对内容有不明白的可以在评论区直接提问,如果是文章有错误的也还请大佬们指导一番,谢谢大家,这段时间我们一起努力吧,YU同学一定会和大家一起进步的!加油,追梦人!

评论 76
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值