C语言-指针_01

指针基础

1. 概述

地址编号:计算机为了存储数据,每一个程序在 32位 机中 占4G最小操作单位一个字节,每一个字节都有其对应的地址,该地址就是 地址编号

指针:地址编号这个数据 的 数据类型

指针变量:存储地址编号的 变量,其 数据类型为 指针

在这里插入图片描述

注意:

在32位平台下, 地址总线是32位的, 所以地址是32位编号, 所以指针变量是32位的, 即4个字节。
在64位平台下, 地址总线是64位的, 所以地址是64位编号, 所以指针变量是64位的, 即8个字节。

代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{printf("char * 大小为:%ld\n",sizeof(char *));printf("short * 大小为:%ld\n",sizeof(short *));printf("int * 大小为:%ld\n",sizeof(int *));printf("long * 大小为:%ld\n",sizeof(long *));printf("float * 大小为:%ld\n",sizeof(float *));printf("double * 大小为:%ld\n",sizeof(double *));return 0;
}

输出:

char * 大小为:8
short * 大小为:8
int * 大小为:8
long * 大小为:8
float * 大小为:8
double * 大小为:8

2. 指针变量

1.1 定义

语法:

数据类型 变量名

指针的类型:

char * 		存储字符型数据的地址编号的数据类型 		   字符指针
short * 	存储short型数据的地址编号的数据类型 		短整形指针
int * 		存储int型数据的地址编号的数据类型 			整形指针
long * 		存储long型数据的地址编号的数据类型 		长整形指针
float * 	存储float型数据的地址编号的数据类型 		单精度浮点型指针
double * 	存储double型数据的地址编号的数据类型 		双精度浮点型指针
...

如:

//案例1: int num = 10; 定义一个指针变量存储num的地址
int *p;
//案例2: char c = 'a'; 定义一个指针变量存储c的地址
char *p
//案例3: int *p = &num; 定义一个指针变量存储变量p的地址
int **p2;

注意:

如果在一行中定义多个指针变量,每个指针变量前面都需要加*来修饰
void fun05()
{int a,b,c;int *p1,*p2,*p3;
}

1.2 初始化

(1)、定义指针变量时,赋真实的地址

int num = 10;
int *p = &num;

(2)、当指针变量的值 等于 NULL 时,这种指针叫做 空指针

int *p = NULL;

(3)、当指针变量是局部变量,在其定义时没有赋值,此时系统将随机给其一个值,这种指针称为 野指针

int *p;

1.3 运算符

1.3.1 &
  • 作用:取地址

  • & 取地址符 可取区域只能获取变量地址

    栈区

    静态全局区

在这里插入图片描述

  • 代码:

    #include <stdio.h>
    char c = 'a';
    int main(int argc, char const *argv[])
    {int num = 10;int *p = &num;printf("p = %p\n", p);char *p2 = &c;printf("p2 = %p\n", p2);// int *p3 = &10;  //& 取常量10的地址会报错const int num02 = 20;int *p4 = &num02;printf("p4 = %p\n", p4);return 0;
    }// 输出:
    // p = 0x7ffe8dfe59f8
    // p2 = 0x601040
    // p4 = 0x7ffe8dfe59fc
    
1.3.2 *

作用:取值改值(修改指针指向的地址的值)

语法:*指针变量名

#include <stdio.h>
int main(int argc, char const *argv[])
{int num = 10;int *p = &num; 				//此时 * 表示 变量p是int型指针变量printf("*p = %d\n", *p); 	//此时 * 表示为取值*p = 20;printf("num = %d\n", num);return 0;
}// 输出:
// *p = 10
// num = 20

3. 指针类型

3.1 指针本身的类型

指针变量 去除 变量名,剩余的就是 指针本身的类型

如:

int *p1;	// int *  
int **p2;	//int **
int (*p)(int int);//int (*)(int,int)
...

例:

#include <stdio.h>
int main(int argc, char const *argv[])
{int num = 10;int *p = &num;			//去除变量名,剩余指针类型 int *,便于判断等号左右两边类型是否一致printf("p = %p\n", p);char *p2 = &num;		//语法错误,=两边类型不一致,但是编译器会做优化,只报警告,不报errorprintf("p2 = %p\n", p2);return 0;
}

在这里插入图片描述

3.2 指针指向的数据的数据类型

指针变量 去除 变量名与最近的一个,剩余的就是 指针 指向的数据的 类型

如:

int *p1;  			// int
int **p2; 			// int *
int (*p)(int int); 	//int (int int)
...

3.3 取值宽度

int num = 0x01020304;
int *p = &num;
print("*p = %d\n", *p);

问题:num为int型变量,占4个字节,那就是4个地址(1个字节,一个地址),

​ 那么指针变量p在存储num的地址时,是怎么存储的?存储的是哪个地址?

答:指针变量有取值宽度,如下:

指针变量的数据类型 决定了 取值宽度:

int * 		取值宽度为4字节
char * 		取值宽度为1字节
short * 	取值宽度为2字节
...

例:与单位跨度同一代码

3.4 单位跨度

指针变量的数据类型 决定了 单位跨度:(就是地址在进行加减时地址增减的字节数)

int * 		单位跨度为4字节
char * 		单位跨度为1字节
short * 	单位跨度为2字节

例:

#include <stdio.h>int main(int argc, char const *argv[])
{int num = 0x01020304;//对应的十六进制:0x0000 0001 0000 0010 0000 0011 0000 0100//Linux系统存储是倒叙存储的://0000 0100 0000 0011 0000 0010 0000 0001//0x04 0x03 0x02 0x01int *p = &num;printf("*p = %d\n", *p);    //*p = 16909060char *p2 = (char *)&num;    //强制转换为char *类型printf("*p2 = %d\n", *p2);  //*p2 = 4short *p3 = (short *)&num;  printf("*p3 = %d\n", *p3);  //*p3 = 772  对应的十六进制:0x0304printf("*p2 = %d\n", *(p2+1)); //*p2 = 3 对应的十六进制:0x03 此时p2为首个字节存储的地址+1,加的是一个单位跨度即1字节printf("*p2 = %d\n", *(p2+2)); //*p2 = 2 对应的十六进制:0x02 步长为1,+2表示向后挪二位printf("*p3 = %d\n", *(p3+1)); //*p3 = 258 对应的十六进制:0x0102 步长为2,+1表示向后挪二位return 0;
}

4. void

作用:

1、当函数没有返回值时,返回值类型为void;

2、void和指针结合作为一种指针类型,如 void * , 这种指针被称为 万能指针,意味着任何一种地址可以赋值给该类型的指针变量

例:

#include <stdio.h>
int main(int argc, char const *argv[])
{char c = 'a';short s = 1;int num = 10;char * p1 = &c;short * p2 = &s;int * p3 = &num;printf("*p1 = %d\n", *p1);printf("*p2 = %d\n", *p2);printf("*p3 = %d\n", *p3);void * p4 = &c;void * p5 = &s;void * p6 = &num;return 0;
}

5. 指针变量使用的注意事项

5.1 野指针操作会出现段错误

void fun01()
{//野指针int *p;printf("*p=%d\n",*p);
}

在这里插入图片描述

5.2 空指针操作会出现段错误

void fun02()
{//空指针int *p = NULL;printf("*p=%d\n",*p);
}

在这里插入图片描述

5.3 不要对万能指针进行操作

void fun03()
{int num = 10;int *p = &num;printf("*p=%d\n",*p);void *p2 = &num;printf("*p2=%d\n",*p2);
}

在这里插入图片描述

5.4 操作指针变量不要越界

#include <stdio.h>void fun04()
{int num = 0x01020304;int *p = &num;char *p2 = (char *) p;printf("%#p\n",*p2);printf("%#p\n",*(p2+1));char c = 'a';char * p3 = &c;//1int *p4 = (int *)p3;printf("%#p\n",*p4);
}int main(int argc, char const *argv[])
{fun04();return 0;
}// 输出:
// 0x4
// 0x3
// 0x2030461

6. 练习

案例1:以下赋值语句正确的是___
int num=10, *p=&num, **q=&p;
A:p=&num B:q =p; c:q=&num D:q=&p;正确答案:AD
但是,Bc也可以通过,会有警告,相当于指针变量赋给二维指针变量

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TPC通信-BS架构

BS架构-基本原理 BS框架基本原理 使用线程池对BS架构进行优化

docker部署typecho博客

文章目录 1.安装git2.安装compose3.拉取仓库4.创建目录5.配置文件修改6.启动容器7.修改MYSQL数据库8.安装成功9.参考GitHub文档 1.安装git 安装git yum -y install git2.安装compose &#xff08;docker安装参考&#xff1a;docker基本知识&#xff09; 确保已经安装了 Doc…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS &#xff08;1&#xff09;HTTP &#xff08;2&#xff09;HTTPS &#xff08;3&#xff09;HTTP与HTTPS区别 &#xff08;4&#xff09;HTTPS对HTTP的改进&#xff1a;双问的身份认证 三、TCP协议 &#xff08;1&#xff09;TCP三次握手…

⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新

写 Unity Shader的时候&#xff0c;只有播放状态下的 Game 面板能看到Shader 顺畅的动态效果&#xff0c;不方便。 想要带有动态效果的 Shader 在 Scene 面板持续更新动画&#xff0c;只需要打开一个开关就能让 Scene 持续刷新动画了。 感谢大家的观看&#xff0c;您的点赞和关…

在oracle中的scn技术

SCN可以说是Oracle中一个很基础的部分&#xff0c;但同时它也是一个很重要的。它是系统中维持数据的一致性和顺序恢复的重要标志&#xff0c;是数据库非常重要的一种数据结构。 转载&#xff1a;深入剖析 - Oracle SCN机制详细解读 - 知乎 (zhihu.com)https://zhuanlan.zhihu.…

基于运算放大器的电压采集电路

一、运算放大器 运放推导的两个重要概念&#xff1a;虚短、虚断。 1、差分放大器 以差分放大器为例进行推导分析。 虚断–运放的"-“端、”“端的引脚电流接近为0&#xff1b; 根据基尔霍夫电流定律可知&#xff1a;iR1iRF&#xff0c;iR2iR3&#xff1b; iR1(Ui1-(V-…

C语言结构体详解(一)(能看懂文字就能明白系列)

&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;个人主页&#xff1a; 古德猫宁- &#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;…

04.PostgreSQL是如何实现隔离级别的?

PostgreSQL是如何实现隔离级别的&#xff1f; 事务有哪些特性&#xff1f; 事务看起来感觉简单&#xff0c;但是要实现事务必须要遵守 4 个特性&#xff0c;分别如下&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;一个事务中的所有操作&#xff0c;要么…

Istio新架构揭秘:环境化Mesh

自问世以来&#xff0c;Istio因其使用Sidecar&#xff08;可编程代理与应用容器一同部署&#xff09;而备受认可。这种架构选择使Istio用户能够享受其好处&#xff0c;而无需对其应用进行 drast 改变。这些可编程代理&#xff0c;与应用容器紧密部署在一起&#xff0c;因其能够…

java学习part27线程死锁

基本就是操作系统的内容 138-多线程-线程安全的懒汉式_死锁_ReentrantLock的使用_哔哩哔哩_bilibili

【大模型】更强的 ChatGLM3-6B 来了,开源可商用

【大模型】更强的 ChatGLM3-6B 来了&#xff0c;开源可商用 简介ChatGLM3-6B 环境配置环境搭建安装依赖 代码及模型权重拉取拉取 ChatGLM3-6B拉取 ChatGLM3-6B 模型权重及代码 终端测试网页测试安装 gradio加载模型并启动服务 参考 简介 ChatGLM3-6B ChatGLM3-6B 是 ChatGLM …

基于STM32的四轴飞行器的控制系统(论文+源码)

1.系统设计 本次基于stm32单片机的四轴飞行器控制系统主要包括硬件和软件这两大部分&#xff0c;其中硬件部分是基于单片机的四轴飞行器控制系统实现的基石&#xff0c;其中主要STM32单片机负责整个系统功能的实现&#xff1b;NRF24L01无线模块负责对四轴飞行器的远程控制&…

rtmp 协议详解

1. handshake 1.1 概述 rtmp 连接从握手开始。它包含三个固定大小的块。客户端发送的三个块命名为 C0,C1,C2&#xff1b;服务端发送的三个块命名为 S0,S1,S2。 握手序列&#xff1a; 客户端通过发送 C0 和 C1 消息来启动握手过程。客户端必须接收到 S1 消息&#xff0c;然后…

MS721仪表总线收发器可Pin to Pin兼容TSS721A

MS721 是为 M-Bus 标准&#xff08;EN1434-3&#xff09;的应用而开发的单片收发电路。MS721 接口电路可以适应从站与主站之间的电压差&#xff0c;总线的连接没有极性要求&#xff0c;电路由主站通过总线供电&#xff0c;这样对于从站电池就不会增加额外的负载&#xff0c;同时…

轻量级万物分割SAM模型——MobileSAM安装实测摘要

目录 0、前言1、准备工作安装python环境说明安装说明 运行测试app安装依赖修改代码 2、实际测试效果自带图片测试其它图片测试1其它图片测试2 总结 0、前言 本文将介绍一种轻量级万物分割SAM模型——MobileSAM的安装和实测情况。SAM是meta公司的一种图像分割大模型&#xff0c…

css中的 Grid 布局

flex布局和grid布局区别 flex布局是 一维布局grid布局是二维布局 flex布局示例 grid布局示例 grid 布局初体验 体验地址 <div class"wrapper"><div class"one item">One</div><div class"two item">Two</div&…

Asp.net core WebApi 配置自定义swaggerUI和中文注释,Jwt Bearer配置

1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释&#xff08;默认是没有中文注释的&#xff09; 2.1创建一个新的controller using Micr…

开源堡垒机Jumpserver

文章目录 开源堡垒机JumpserverJumpserver介绍安装环境部署安装jumpserver访问jumpserver的web界面 开源堡垒机Jumpserver Jumpserver介绍 Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是符合 4A 的运维安全审计系统。 Jumpse…

J-LINK J-FLASH 下载STM32单片机程序使用教程

J-LINK J-FLASH 下载STM32单片机程序使用教程 Chapter1 J-LINK J-FLASH 下载STM32单片机程序使用教程1.安装提供的 JLINK驱动程序2. 点击打开 J-Flash V7.223.点击 create a new project.&#xff08;使用后可以在软件菜单File保存这个烧写工程&#xff0c;后续直接打开使用即可…

SHAP(四):NHANES I 生存模型

SHAP&#xff08;四&#xff09;&#xff1a;NHANES I 生存模型 这是一个 Cox 比例风险模型&#xff0c;基于来自 NHANES I 的数据以及来自 NHANES I 流行病学随访研究。 它旨在说明 SHAP 值如何能够以传统上仅由线性模型提供的清晰度解释 XGBoost 模型。 我们在数据中看到有趣…