C语言——指针(一)

📝前言

这篇文章主要带大家初步认识一下指针,供大家理解参考。

主要归纳与讲解:

1,指针与指针变量

2,指针的基本使用 (如何定义初始化引用

🎬个人简介:努力学习ing

📋个人专栏:C语言入门基础

🎀CSDN主页 愚润求学

🌄每日鸡汤:雄鹰不为暴风折翼,狼群不因长夜畏惧

文章目录

一,指针与指针变量

相信大家在学习C语言的时候常常听到别人提起地址指针,那究竟什么是地址?什么是指针?什么又是指针变量?

1,地址

●拿学校举例:

学校建成时就有很多宿舍 ,为了区分不同的宿舍,每个宿舍都有自己独有的门牌号 ,当学校来了新同学时,学校就会给同学分配宿舍 ,而宿舍的门牌号就代表了同学居住的地址

●C语言中的地址也是这样:

计算机的内存有很多储存单元 ,为了区分这些储存单元,计算机的操作系统就给每个储存单元都分配了自己唯一的编号 ,当我们在C语言中定义变量的时候,编译器就会给变量分配储存空间这个 储存空间的编号就是存放变量的地址

2,指针

C语言把数据储存的起始地址称为指针

简单来说:"指针"不过是C语言中对地址的一个新描述,新名字。

其实就是:储存单元的编号 == 地址 == 指针

3,指针变量

指针变量就是一种用来存放指针的变量

就像存放数字的变量 我们称为整型变量 ,那么存放指针的变量 ,我们就成为指针变量

例如:

c 复制代码
int a = 1;      //我们把1赋值给变量a, a是整型变量
int* ptr = &a;  //我们把a的地址赋值给ptr, ptr是指针变量

二,指针变量的基本使用

1,指针变量的定义

定义格式:

c 复制代码
int   *p1;    //定义了指向整型的指针变量,指针变量的类型是:int*
float *p2;  //定义了指向浮点型的指针变量,指针变量的类型是:float*
char  *p3;  //定义了指向字符型的指针变量,指针变量的类型是:char*

这里的"*" 是一个标识符,其含义是:代表了变量的类型是指针类型

这的 int/float/char 指的是指针所指向的数据的类型

指针变量也有不同的类型:把指针名字去掉,就是指针变量对应的类型。

我们如何理解指针变量的类型呢?

因为不同类型的变量所占用的内存的空间大小不同 ,因此指针变量前面的数据类型表示:保存的地址是对应数据类型的变量的指针

从语法上看,我们只须把指针声明语句中的指针名字名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

例如:
int *p1; //指p1存放的是一个存放整型数 的起始地址。
float *p2; //指p2存放的是一个存放浮点数 的起始地址。
char *p3; //指p3存放的是一个存放字符型数据 的起始地址。

如图:

4,指针变量的大小

我们都知道变量类型的大小与放什么内容有关

比如:

int类型放的是数字,大小是4字节。

char类型放的是字符,大小是1个字节。

那么指针变量的大小也就取决于放一个地址需要多大的空间

计算机决定的:

在32位机器上,存放一个地址要32个bit位,那么,在**32位机器上,一个地址的大小就是4个字节,指针变量的大小也就是4个字节
在64位机器上,存放一个地址要64个bit位,那么,在
64位机器**上,一个地址的大小就是8个字节,指针变量的大小也就是8个字节。

2,指针变量的初始化

指针变量可以在声明时 或者在赋值语句 中初始化。可以被初始化为0,NULL或者普通变量的地址。

NULL的指针不指向任何数据,也被称为"空指针",表示数值0。

初始化如下:

c 复制代码
int m = 3;
int *p1 = &m; //用普通整型变量m的指针初始化
double *p2 = 0; //p2指针变量不指向任何浮点数
int *p3 = NULL; //p3指针变量不指向任何整型数

当我们不初始化指针变量时,指针变量的值是随机的。

●注意:

1,尽可能使指针初始化 ,以防止指针指向一个未知的或者未被初始化的内存空间,变成野指针。

2,除了0以外,不能用其他具体的数字直接赋值给指针变量。

3,指针变量的引用

指针变量和其他变量相似,都可以进行赋值取值 操作。

例如:

c 复制代码
int m = 3;
double f = 4.5;
char ch = 'a';
//主要说明一下下面几句代码
int *p1 = &m;
double *p2 = &f;
char *p3 = &ch
int *p = p1

p1=&m 表示:将m的地址赋值给p1,此时p1就指向m

②p2=&f 表示:将f的地址赋值给p2,此时p2指向f。

③p3=&ch 与前两句同理,即p3指向ch。

p=p1 表示:将变量p1中的指针赋值到p变量中,此时p也指向了m储存单元

如图:

4,解引用操作符(" * ")

作用是:取出指针变量所指向的内存单元中的值

下面我们在代码中理解,如:

(1)

c 复制代码
int a = 100;
int* pa = &a;
*pa = 0;

*pa=0的作用是:把a的值改成了0,在这里(*pa)的意思是通过pa中存放的地址,找到指向的空间 (其实就是a)

(2)

c 复制代码
int p,m;
scanf("%d",&m);
p = &m;
printf("%d %d\n",m, *p);
printf("%x",p);

程序的输出结果:

输入:3

输出:3 3 //这里打印的是 m 和(p)的值
22ff40 // 这里打印出的是 p中的指针 ,不同的计算机可能值不同
不难发现,m 与
p的结果是相同的,即 * 的作用就是:通过p中存放的m的地址,找到m。


🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!最后,☺祝愿大家天天开心!!!

相关推荐
起名字真南12 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去13 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
tyler_download24 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~24 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#25 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透26 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man29 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、29 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
测试界的酸菜鱼43 分钟前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL43 分钟前
lua入门教程 :模块和包
开发语言·junit·lua