C语言指针学习 之 指针变量

前言:

        通过学习我们认识了什么是指针,就让我们一起来分析一个例子。

#include<stdio.h>
int main()
{
    int a=100;
    int * hz;  
    hz =&a;
    printf("a=%d \n",a);
    printf("*hz=%d \n",*hz);
  return 0;
}


a=100 
*hz=100 
PS C:\csay\cyuyan> 

        (1)在开头处定义了一个指针变量hz,此时并没有指向任何一个变量,只是提供一个指针变量,规定它可以指向整型变量,hz =&a就是使hz指向a,此时hz的值为a的地址。

        (2) printf("*hz=%d \n",*hz)输出*hz的值,其中的*表示指向,*hz表示指针变量hz指向的变量,也就是变量a。

        (2)程序中出现了两处*hz,它们的含义不同,第一个*hz表示定义了一个指针变量hz,前面的*表示该变量是指针变量,第二个*hz代表指针变量hz所指向的变量。

指针变量的定义:

        C 语言规定所有变量在使用前必须先定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,所以必须将它定义为“指针类型”。

        指针变量定义的一般形式为:

        基类型 *指针变量名;

        比如:

        int*i;    float*j;

        “*” 表示该变量的类型为指针类型。指针变量名为 i 和 j,而不是 *i 和 *j。

        在定义指针变量时必须指定其“基类型”。指针变量的“基类型”用来指定该指针变量可以指向的变量的类型。比如“int*i;”表示 i 只可以指向 int 型变量;又比如“float*j;”表示 j 只可以指向 float 型变量。

        “基类型”就表示指针变量里面所存放的“变量的地址”所指向的变量可以是什么类型的。说得简单点就是:以“int*i;”为例,“*”表示这个变量是一个指针变量,而“int”表示这个变量只能存放 int 型变量的地址。

        为什么叫“基类型”,而不直接叫类型?因为比如“int*i;”,其中 i 是变量名,i 变量的数据类型是“int*”型,即存放 int 变量地址的类型。“int”和“*”加起来才是变量i的类型,所以 int 称为基类型。

        “int*i;”表示定义了一个指针变量 i,它可以指向 int 型变量的地址。但此时并没有给它初始化,即此时这个指针变量并未指向任何一个变量。此时的“*”只表示该变量是一个指针变量,至于具体指向哪一个变量要在程序中指定。这个就跟定义了“int   j;”但并未给它赋初值一样。

        指针变量也是变量,是变量就有地址,所以指针变量本身也是有地址的。只要定义了一个变量,程序在运行时系统就会为它分配内存空间。但指针变量又是存放地址的变量,所以这里有两个地址大家一定要弄清楚:一个是系统为指针变量分配的地址,即指针变量本身的地址;另一个是指针变量里面存放的另一个变量的地址。这两个地址一个是“指针变量的地址”,另一个是“指针变量的内容”。

        地址也是可以进行运算的,我们后面会学到指针的运算和移动。比如“使指针向后移 1 个位置”或“使指针加 1”,这个 1 与指针变量的基类型是直接相关的。指针变量的基类型占几字节,这个 1 代表的就是几。比如指针变量指向一个 int 型变量,那么“使指针移动 1 个位置”就意味着移动 4 字节,“使指针加 1”就意味着使地址加 4。所以必须指定指针变量所指向的变量的类型,即指针变量的基类型。

        下面给大家举一个例子并分析。

# include <stdio.h>
int main (void)
{
    int * p , * q;
    int k; 
    int i = 3, j = 4;
    p = &i;
    q = &j;
    k = p-q;
    printf(" p = %d\n q = %d\n k = %d\n", p, q, k);
    return 0;
}


 p = 6422024
 q = 6422020
 k = 1
PS C:\csay\cyuyan> 

        两个“int*”型的指针变量相减,第一个指针变量里面存放的地址是6422024,第二个指针变量里面存放的地址是6422020,那么这两个地址相减的结果是是 1,而不是 4。因为 int 型变量占 4 字节,所以一个 int 元素就占 4 字节,两个地址之间相差 4 个地址,正好是一个 int 元素,所以结果就是 1 。

指针变量的引用:  

        引用指针变量时有以下三种情况:

        ① 给指针变量赋值。 ② 引用指针变量指向的变量。 ③引用指针变量的值。

int a, *p;
p=&a;                  //把a的地址赋给指针变量p
printf("%d",*p);    //以整数形式输出指针变量p所指向的变量的值,即a的值
*p=1;                   //将整数1赋给p当前所指向的变量,由于p指向变量a,相当于把1赋给a,即a=1
printf("%o",p);      //以八进制形式输出指针变量p的值,由于p指向a,相当于输出a的地址,即&a

注意:

要熟练掌握两个有关的运算符:

 (1) &取地址运算符。&a是变量a的地址
 (2) * 指针运算符(或称“间接访问”运算符),*p代表指针变量p指向的对象

        下面给大家举一个例子并分析。

#include <stdio.h>
int main()
{	
  int *p1,*p2;	
  int a,b;

	printf("请输入2个数字:");
	scanf("%d %d",&a,&b);

	     p1=&a;							
	     p2=&b;	

	if(a<b)						
	{	
     p1=&b;
     p2=&a;
    }
  else
  {
    p1=&a;							
	  p2=&b;
  }		
	printf("a=%d,b=%d\n",a,b);			

	printf("max=%d,min=%d\n",*p1,*p2);	
	return 0;
}


请输入2个数字:7 8
a=7,b=8
max=8,min=7
PS C:\csay\cyuyan> 
请输入2个数字:3 2
a=3,b=2
max=3,min=2
PS C:\csay\cyuyan> 

        开头处定义了2个指针变量p1和p2,此时并没有指向任何一个变量,只是提供一个指针变量,规定它可以指向整型变量,其次从键盘输入2个整型数据,判断a和b的大小,如果a<b,则将p1和p2交换否则不交换,最后输出p1和p2所指向变量的值。、

🚀感谢:给读者的一封信


亲爱的读者:

       这篇文章中我投入了大量的心血和时间,希望为大家提供有价值的内容。

        如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。

        如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

                    

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot yaml文件中如何设置duration对象值

Spring Boot对表示持续时间有专门的支持。如果您公开java.time.Duration属性&#xff0c;则应用程序对应Duration类型的属性有以下格式可用: long类型的常规表示(使用毫秒作为默认单位&#xff0c;除非指定了DurationUnit)java.time.Duration 使用的标准ISO-8601格式其中值和单…

【巧用异或】单身狗2题解

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;【每日刷题】C语言 个人主页&#xff1a;Celias blog~ 题目 一个数组中只有两个数字是出现一次&#xff0c…

应对手机数据丢失的5大安卓数据恢复软件

我们都去过那里。您的手机上的数据丢失了&#xff0c;现在无法恢复。这尤其令人恐惧&#xff0c;因为我们的手机上都有如此多的信息。从图片、应用程序、个人信息&#xff0c;甚至是来自可能已不复存在的亲人的短信和语音邮件。这种情况确实发生了&#xff0c;而且也不仅仅是An…

【Java程序设计】【C00239】基于Springboot的漫画之家管理系统(有论文)

基于Springboot的漫画之家管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的漫画之家系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页&a…

【Tomcat与网络3】Tomcat的整体架构

目录 1.演进1&#xff1a;将连接和处理服务分开 2演进2&#xff1a;Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理&#xff0c;本文我们结合Tomcat来分析一下如何设计一个大型…

Flutter开发2:安装Flutter

在本篇博客中&#xff0c;我们将详细介绍如何安装Flutter开发环境。安装Flutter是开始使用Flutter进行跨平台移动应用开发的第一步。让我们开始吧&#xff01; 官方安装文档 步骤1&#xff1a;下载Flutter SDK 打开浏览器&#xff0c;访问Flutter官方网站&#xff1a;https://…

latex multirow学习

今天搞了一晚上的这个multirow&#xff0c;总算弄出来了几个比较好的例子&#xff0c;主要是这个multirow的语法我没看懂&#xff0c;这个逻辑我是没理解&#xff0c;就很尴尬&#xff0c;一改就报错&#xff0c;只能先弄几个例子&#xff0c;自己慢慢试 \documentclass{artic…

Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询

1概况 本文展示如何使用 Flink CDC Iceberg Doris 构建实时湖仓一体的联邦查询分析&#xff0c;Doris 1.1版本提供了Iceberg的支持&#xff0c;本文主要展示Doris和Iceberg怎么使用&#xff0c;大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。 2系统架构 我们整…

vscode实时预览markdown效果

安装插件 Markdown Preview Enhanced 上面是搜索框 启动预览 右键->Open Preview On the Side 效果如下&#xff1a; 目录功能 目录功能还是使用gitee吧 push后使用gitee&#xff0c;gitee上markdown支持侧边生成目录

深度学习环境配置:Anaconda 安装和 pip 源

conda是一种通用包管理系统&#xff0c;与pip的使用类似&#xff0c;环境管理则允许用户方便地安装不同版本的python并可以快速切换。 Anaconda则是一个打包的集合&#xff0c;里面预装好了conda、某个版本的python、众多packages、科学计算工具等等&#xff0c;就是把很多常用…

阿里云a10GPU,centos7,cuda11.2环境配置

Anaconda3-2022.05-Linux-x86_64.sh gcc升级 centos7升级gcc至8.2_centos7 yum gcc8.2.0-CSDN博客 paddlepaddle python -m pip install paddlepaddle-gpu2.5.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 报错 ImportError: libssl.so…

【Java程序设计】【C00187】基于SSM的旅游资源网站管理系统(论文+PPT)

基于SSM的旅游资源网站管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游资源网站 本系统分为前台系统、用户和管理员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是…

SQL注入

SQL分类 一.根据注入的方式来分类: 1.get注入 2.post注入 3.cookie注入 二注入方式来分类 1.有回显的注入 2.盲注 3.二次注入 4.报错注入 5堆叠注入 6宽字节注入 简单检测一下 利用单引号或者双引号或者\来检测是否存在注入&#xff0c;如果爆出sql错误或者出现不回显90%…

【go语言】error 错误处理详解

前言 在软件开发中&#xff0c;错误码是一种重要的信息传递方式&#xff0c;对于开发者和用户都具有重要的意义。一般情况下&#xff0c;系统出现故障&#xff0c;由运维在狂轰滥炸的报警信息中找到关键错误信息和研发人员进行沟通&#xff0c;再查看代码逻辑理清问题根源&…

git小白进阶之路

git是最常用的版本控制工具&#xff0c;我对其进行了整理后续补充&#xff0c;这个文档欢迎大家来讨论&#xff0c;当前我的视频梳理&#xff1a; git小白进阶之路_哔哩哔哩_bilibili&#xff0c;非常希望大佬们能够批评指正&#xff0c;并多多交流。 目录 初始配置 配置账号…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

如何用gpt快速做好数据分析?

由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压就能正常完成后续需求。 …

Docker进阶篇-Docker网络

一、描述 1、docker不启动&#xff0c;默认网络情况 查看网卡情况使用&#xff0c;ifconfig或者ip addr ens33&#xff1a;本机网卡 lo&#xff1a;本机回环网络网卡 virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现 …

政安晨的机器学习笔记——示例演绎在TensorFlow中使用 CSV数据(基于Colab的Jupyter笔记)(1.5万字长文超详细)

本笔记提供了如何在 TensorFlow 中使用 CSV 数据的示例&#xff1a;用 tf.data 加载 CSV 数据。 其中包括两个主要部分&#xff1a; 从磁盘加载数据将数据预处理为适合训练的形式。 本笔记侧重于加载&#xff0c;并提供了一些关于预处理的快速示例。 设置 import pandas a…

2024美国大学生数学建模竞赛美赛B题matlab代码解析

2024美赛B题Searching for Submersibles搜索潜水器 因为一些不可抗力&#xff0c;下面仅展示部分代码&#xff08;很少部分部分&#xff09;和部分分析过程&#xff0c;其余代码看文末 Dthxlsread(C:\Users\Lenovo\Desktop\Ionian.xlsx); DpDth(:,3:5); dy0.0042; dx0.0042; …