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 = 6422024q = 6422020k = 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元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。

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

                    

        

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

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

相关文章

Facebook的社交影响力:用户行为解析与趋势

在当今数字时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交平台之一&#xff0c;其社交影响力愈发显著。本文将深入分析Facebook的社交影响力&#xff0c;解析用户行为&#xff0c;同时探讨当前和未来的社交趋势。 社…

2024-02-01 Unity Shader 开发入门4 —— ShaderLab 语法

文章目录 1 材质和 Shader1.1 Unity Shader 和 Shader 的区别1.2 Unity 中的材质和 Shader1.3 创建材质1.4 创建 Shader 2 ShaderLab 的基本结构2.1 什么是 ShaderLab2.2 ShaderLab 的基本结构 3 Shader 名称4 Shader 属性4.1 Shader 属性的作用4.2 Shader 属性的基本语法4.3 数…

【Git】03 图形化工具

文章目录 一、右击菜单二、打开仓库三、可视化所有分支历史四、总结 一、右击菜单 二、打开仓库 三、可视化所有分支历史 四、总结 图形化工具了解一下&#xff0c;要懂得在哪里能找到。

pdmodel从动态模型转成静态onnx

1.下载项目 git clone https://github.com/jiangjiajun/PaddleUtils.git 2.新建两个新的文件夹 第一个文件夹放两个必要文件 第二个文件夹可以设置为空&#xff0c;用来存放转换后的模型 如图&#xff1a; 3.在终端运行 python paddle/paddle_infer_shape.py --model_dir …

AI大模型专题:大模型安全与伦理研究报告2024

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;大模型安全与伦理研究报告2024》。 &#xff08;报告出品方&#xff1a;腾讯研究院&#xff09; 报告共计&#xff1a;76页 大模型具有不同于传统模型的特点和优势 第一&#xff0c;大模型和传统…

来看看Tomcat和Web应用的目录结构

在前面两篇大致了解了Tomcat的架构和运行流程&#xff0c;以及Tomcat应用中的web.xml。 聊一聊Tomcat的架构和运行流程&#xff0c;尽量通俗易懂一点-CSDN博客 来吧&#xff0c;好好理解一下Tomcat下的web.xml-CSDN博客 那接下来&#xff0c;再看看Tomcat的目录&#xff0c;…

在ESXi中部署时出现the host does not support intel vt-x

在VCenter中新建了一台ESXi用于部署VCSA进行实验 在部署VCSA的第二阶段&#xff0c;出现the host does not support intel vt-x&#xff0c;部署失败。 解决办法&#xff1a;点进ESXi虚拟机的设置界面&#xff08;要先关机&#xff09;&#xff0c;将硬件虚拟化打开&#xff0c…

华为机考入门python3--(8)牛客8-合并表记录

分类&#xff1a;字典排序 知识点&#xff1a; 将输入转成int的列表 my_list list(map(int, input().strip().split( ))) 将列表转为元组 tuple(my_list) 访问元素为元组的列表 for first, second, third in my_list: 对字典进行排序 sorted(my_dict.items())…

6.s081 学习实验记录(四)page tables

文章目录 一、Speed up system calls简介注意实验代码结果 二、Print a page table简介注意实验代码实验结果 三、Detect which pages have been accessed简介注意实验代码实验结果 一、Speed up system calls 简介 许多操作系统通过共享一系列信息到用户态只读页面来加速某些…

C语言第十七弹---指针(一)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、内存和地址 1.1、内存 2、指针变量和地址 2.1、取地址操作符&#xff08;&&#xff09; 2.2、指针变量和解引用操作符&#xff08;*&#xff09;…

VS打包.exe文件步骤

1.借助vs自带扩展工具 2.1打开扩展栏 2.2搜索栏填入 " installer " 2.3下载安装 下载完成后&#xff0c;推出vs自动弹出安装。 2.生成安装包 2.1新建一个项目 2.2输入"setup" 直接下一步 2.3输入项目名称和存储位置、点击创建 出现该栏 2.4选择 主文件…

了解UDP发送过快导致的问题和对应解决方案

在当今这个以数据为核心的时代&#xff0c;企业对于数据传输的速度和稳定性有着日益增长的需求。UDP凭借其低延迟和高效率的特性&#xff0c;在实时通信和大规模数据传输领域扮演着关键角色。然而&#xff0c;UDP的无连接特性和缺乏可靠性也给数据传输带来了挑战&#xff0c;尤…