C语言 | * 与 &

c语言 * 与& 的使用: c语言 * 与& 的使用 阅读详情

取址运算符&

  • 取址运算符&用来取得其操作数的地址。
  • 如果操作数 x 的类型为 T,则表达式 &x 的类型是 T 类型指针(指向 T 的指针)。
  • 取址运算符的操作数必须是在内存中可寻址到的地址。该运算符只能用于函数或对象

间接运算符 *

  • 当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符 *(indirection operator),有时候这会被称为解引用运算符(dereferencing operator)。
  • 它的操作数必须是指针类型
  • 如果 ptr 是指针,那么 *ptr 就是 ptr 所指向的对象或函数。

例子

初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址

  • *与&具有互补性
float x, *ptr;
*&x代表x
&*ptr代表ptr
&ptr代表指向ptr的地址,为`**float`类型
  • 定义一个float指针ptr,指向x的地址
float x, *ptr = &x;
等同于
float x, *ptr;
ptr=&x;
  • 示例
    int *p1,a=1;
    p1=&a;
    cout<<"p1="<<p1<<endl;
    cout<<"*p1="<<*p1<<endl;

    int *p2=&a;
    cout<<"p2="<<p2<<endl;
    cout<<"*p2="<<*p2<<endl;
	
	++*p2;
    cout<<"p1="<<p1<<endl;
    cout<<"*p1="<<*p1<<endl;
    cout<<"p2="<<p2<<endl;
    cout<<"*p2="<<*p2<<endl;
    cout<<"a="<<a<<endl;
    int **p3=&p1;
    cout<<"&p1="<<&p1<<endl;
    cout<<"p3="<<p3<<endl;
    cout<<"*p3="<<*p3<<endl;
    cout<<"**p3="<<**p3<<endl;

p1,p2的值保持不变,但是a的值变成了2。
p3为**int类型,*p3的值等于p1,p2,**p3的值等于a
输出为

p1=0x61fe04
*p1=1
p2=0x61fe04
*p2=1
p1=0x61fe04
*p1=2
p2=0x61fe04
*p2=2
a=2
&p1=0x61fe08
p3=0x61fe08
*p3=0x61fe04
**p3=2
11.第十一章 指针.txt 第十一章 指针 11.1 理解指针 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元。为了正确访问内存单元,必须为每个内存单元编号,根据一个内存的编号即可准确找到该内存单元,内存单元的编号也叫地址,通常把这个地址称为指针(pointer)。一个指针变量的值就是某个内存单元的地址(或称某个内存单元的指针)。 在一个指针变量中存放一个数组的首地址,因为数组是连续存放的,通过访问指针变量取得数组的首地址,也就找到了该数组。在C语言中,一种数据类型或数据结构往往占有一组连续的内存单元,用指针描述一个数据结构的首地址,该指针指向这个数据结构。 11.2 指向变量的指针 #include int main() { int i=1,*pi=&amp;i; printf(&quot;%d&quot;,sizeof(pi)); return 0; } 变量i的三个属性: (1)值:为1,通过变量名访问,如i+5。 (2)地址:占用内存空间的位置,通过&amp;i访问。 (3)类型:为int,决定该变量能参加的运算,决定了其占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小用sizeof运算符计算,sizeof(i)或sizeof(int)。 变量的指针就是变量的地址,存放变量地址的变量是指针变量。C语言中允许用一个变量存放指针,称为指针变量。 11.2.1 指针变量定义 指针变量定义的一般形式: 类型说明符 *变量名; 如: int *pi; 对指针变量的定义包括3个内容: (1)指针类型说明:*表示这是一个指针变量。 (2)指针变量名:pi为指针变量名。 (3)指针所指向的变量的数据类型:int为指针变量所指向的变量的数据类型,说明pi只能存储整型变量的地址。 如: float *pf; /*pf为指向浮点变量的指针变量*/ char *pc; /*pc为指向字符变量的指针变量*/ 11.2.2 指针变量引用 未经赋值的指针变量不能使用,否则将造成系统紊乱,甚至死机。指针变量只能赋予地址。C语言中,变量的地址是由编译系统分配的。 与指针相关的两个运算符: (1)&amp;:取地址运算符 一般形式: &amp;变量名 表示取一个内存变量的地址。 (2)*:指针运算符(或称&ldquo;间接访问&rdquo;运算符) 一般形式: *指针变量名 通过指针变间接访问指针变量所指向变量的数据。 #include int main() { int i=1,*pi=&amp;i; printf(&quot;%d&quot;,sizeof(pi)); return 0; } 对指针变量的应用的说明: a.对*要区别类型说明符与间接访问符。 b.不能用一个数给指针变量赋值,但是指针可用0赋值,代表空指针,即不指向任何数据。 c.给指针变量赋值时,指针变量前不能加*。 如:int i; int *pi; *pi=&amp;i; /*写法错误,应该为pi=&amp;i*/ pi赋值&amp;i后可用*pi间接访问i d.指针变量为指向具体有效地址时,直接访问会有危险。 如: int *pi; /*指针变量pi为赋值,不知道指向哪里*/ *pi=200; /*向pi所指向的地址空间赋值200*/ C语言对未赋值的指针变量的值是不确定的。上面语句中使pi所指向的空间赋值200,这时,当pi指向有用数据空间时,该数据将被200覆盖,导致数据破坏;当指针pi指向系统空间时,系统遭到破坏,严重时将导致系统瘫痪。 指针变量定义时,编译系统就会给定一个值,如何判定一个指针变量是否指向有用数据空间,建议定义指针时初始化为0,间接访问前让它指向有效空间,这样间接访问时可以判断指针是否指向有效地址。如: int *pi=0; &middot; &middot; &middot; if(pi!=0) *pi=200; 省略号部分,若未使pi指向有效空间,对*pi的赋值不会进行。 e.指针变量的值可以改变,像普通变量一样被重新赋值,就是说可以改变指针变量的指向。 f.指针变量只能用同类型的地址赋值。 g.同类型指针变量间可以相互赋值。 例:交换指针变量的值。 #include int main() { int i1=3,i2=4; int *pi1=&amp;i1;,*pi2=&amp;i2;,*pi3=0; printf(&quot;*pi1=%d\t*pi2=%d\n&quot;,*pi1,*pi2); pi3=pi1; pi1=pi2; pi2=pi3; printf(&quot;*pi1=%d\t*pi2=%d\n&quot;,*pi1,*pi2); return 0; } 运行结果: *pi1=3 *pi2=4 *pi1=4 *pi2=3 交换了指针变量的值,导致指针变量交换了指向。 例:交换指针变量所指向的数据的值。 #include int main() { int i1=3,i2=4,temp=0,*pi1=&amp;i1;,*pi2=&amp;i2; printf(&quot;i1=%d\ti2=%d\n&quot;,i1,i2); temp=*pi1; *pi1=*pi2; *pi2=temp; printf(&quot;i1=%d\ti2=%d\n&quot;,i1,i2); } 运行结果: i1=3 i2=4 i1=4 i2=3 11.3 数组与指针 一个数组包含若干元素,每个数组元素都在内存中占用内存单元。数组的指针是指数组的起始地址,数组元素的指针是指数组元素的地址。 11.3.1 一维数组与指针 一个数组是由连续的一块内存单元组成的,数组名就是这块连续内存单元的首地址(常量)。一个数组元素的首地址也是指它所占有的内存单元的首地址。 #include int main() { int arr[5]; printf(&quot;%d&quot;,arr==&amp;arr;[0]); return 0; } 运行结果: 1 arr与&amp;arr;[0]指向同一内存单元,都是数组的首地址,也是0号元素的首地址。arr是常量地址,&amp;arr;[0]是整型变量arr[0]的地址。 1.指针相关的运算符 (1)取地址运算符&amp; (2)间接访问运算符* (3)赋值运算符=,给指针变量赋值。 (4)算术运算符+、-、++、-- p1+i:结果为p1地址值位置跳过(i*p1所指类型字节数)个字节后的地址。 p1-i:结果为p1地址值位置跳回(i*p1所指类型字节数)个字节后的地址。 p2-p1:结果为相差字节数&divide;指针变量所指类型字节数。 p2++:结果为p1地址值位置跳过p1所指类型字节数后的地址。 (5)关系运算,支持六种关系运算符,用来比较地址的大小。 例: int arr[5]; int *p1,*p2; p1=&amp;arr;[0]; p2=&amp;arr;[4]; ①*p1++:*和++同优先级,结合方向从右到左,所以*p1++等价*(p1++),先执行*p1,然后p1加1。表达式的值为arr[0],p1的值为&amp;arr;[1]。 立即下载

相关推荐

Argoverse2数据集保姆级导入教程:从下载到预处理全流程解析

本文详细解析了Argoverse2数据集的完整导入流程,从环境配置、数据下载到预处理和高效加载策略。作为自动驾驶领域的标杆数据集,Argoverse2提供多模态传感器数据和高精地图信息,帮助研究者快速搭建数据处理流水线。文章包含实用代码示例和性能优化技巧,特别适合自动驾驶算法开发者参考。

weixin_29035405的博客 337

c语言编程中出现错误: 表达式必须包含指向对象的指针类型。 该错误如何解决? 下文解答

具体原因是因为arr数组本质是一个指针类型,指向的是首元素的地址,如果用int 来接收显然不合适,以至于在引用下列定义的int类型的变量时候产生错误——表达式必须包含指向对象的指针类型,但他具有类型"int",解决的办法也很简单,将自定义函数的参数中的 char*board 改成char board[ROW][COL]必须包含指向对象的指针类型,但他具有类型"int"char arr[] 的写法比char*arr要好。

Yskm_sir的博客 1万+

2025趋势:经济学研究中AI多智能体系统的6大架构方向(AI应用架构师必藏)

多智能体系统(MAS)由多个相互作用的智能体组成,每个智能体具备自主决策能力、感知环境的能力和与其他智能体通信的能力。微观行为的精细化建模:智能体可被赋予异质的偏好函数、信息集和决策规则,模拟真实市场的多样性动态交互的涌现性分析:通过智能体间的局部互动(如交易、合作、竞争),观察宏观经济现象的涌现过程反事实政策实验:在虚拟环境中安全测试极端政策(如负利率、全民基本收入)的连锁反应实时自适应调整:智能体可通过机器学习持续优化策略,模拟经济系统的演化特性。

AI 领航者的博客 1424

表达式必须包含指向对象的指针类型_不友好的指针总结

指针是多个概念的简称,有文章把指针数据简称为指针,也有文章把指针变量简称为指针,还有文章把指针数据的类型简称为指针。本文不使用指针简称,尽可能使用特定名称来描述具体概念。语言和机器不言而明,C语言使用符号来描述具体的机器运作,正如人类使用语言来表达行为活动。编译器便是将符号映射成机器部件或机器运动的实体程序,且编译器的行为是由c标准规则规定的。编译器的强大使我们往往忽略了符号转换成机器实体的过程。...

weixin_39674028的博客 3340

ANSYS WB 网格划分详解与技巧

本文详细介绍了网格操作中的关键设置与功能选项。主要内容包括:1)网格显示风格与物理偏好设置;2)单元阶次选择对精度的影响;3)单元尺寸控制方法;4)尺寸调整功能,重点讲解了自适应尺寸调整、增长率控制和捕获曲率等选项;5)网格质量评估标准;6)四种主要划分方法(四面体、六面体主导、扫掠、多区域)的特点与适用场景;7)三种尺寸调整方式(直接调整、边缘尺寸调整、影响范围调整)的具体应用。文章强调在实际建模中需要根据模型特点合理选择网格参数,平衡计算精度与效率。

2403_87939837的博客 1698

YOLOv8 模型进化全解析:百种创新模块集成方法与实战部署指南(附资料链接)

动态网络 | DeformableConv/DynamicHead| +2.8% || 轻量化卷积 | GhostConv/MobileConv | +1.2% || 多尺度融合 | AFPN/ASFF | +3.5% || 注意力机制 | CA/EMA/SimAM | +1.8-4.2% |

FJN110的博客 111

表达式必须包含指向对象的指针类型,但他具有“int“?

【代码】表达式必须包含指向对象的指针类型,但他具有"int"?

quantian_的博客 3万+

通信算法之264: DJI O2 协议物理层逆向工程解析

对于 DroneID,标志之间的间隙由循环前缀 (CP) 填充:每个标志末尾的副本附加在相应标志的开头。有了关于确切标志开始的信息,可以使用 FFT 将标志转移到频域 - 来自时域的 1024 个样本导致频域中的 1024 个子载波。使用比特流的解扰和涡轮解码,并将生成的数据映射到如上的DroneID 结构,通过逆向工程在无人机的固件中找到了它。注意到一些无人机(Mavic 2 和更早的 OcuSync 无人机)不发送第一个标志(标志 1),这导致更短的帧持续时间为 576 µs。//产品型号数字代号。

leegang12的专栏 3946

表达式必须包含指向对象的指针类型

编写的常见小错误

m0_50966854的博客 7555

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 81

【CANoe示例分析】0002_SOMEIPDemo

该工程由Vector官方提供,作为仿真SOME/IP节点的示例。Demo中介绍了两种仿真SOME/IP节点的方法,一种是基于arxml数据库的仿真,另一种是没有数据库(arxml、fibex)的仿真。无论是哪种形式的仿真,如果想要通过CAPL程序接收或者发送SOME/IP信息,都需要添加交互层的信息,这些信息可以通过添加DLL文件实现,DLL文件路径在CANoe安装目录下的Exec32文件中。

jasonj333 3519

C语言指针 * 和 & 总结

C语言指针*和&amp;的总结 前言 最近复习了C语言中指针,在网上看了一些资料,发现很多人在解释指针的时候提到了“引用”这个概念,但是C语言是没有这个概念的,大概是在学习时是用来cpp的来学习。所以在这里有一点误会。C语言中是没有引用这个概念的。如果大家在刚开始学习c语言时,尽量用GCC编译器。以免混淆一些概念。 指针 例如在有: int a = 10; int* p = &amp;a; 在定义一个整型变量a后 ,定义一个整型指针p指向a,在这里p中存放的是存放变量a的地址。对于指针,谭

sy1227081317的博客 5345

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C语言】*与&深层理解

C语言的*与&的理解与误区说明

weixin_74776798的博客 2298

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言中的*和&符号

之前对*和&符号一直理解的比较浅显。只知道: *p好像表示的是一个指针; &p表示的是一个地址。 然而这次当遇到了下面这个情况的时候: int a = 10; int *b = &a;printf(“%d\n”, a); printf(“%d\n”, &a); printf(“%d\n”, b); printf(“%d\n”, *b);结果: 10 6487620 648762

qq_21583681的博客 12万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex&trade;-M4F 内核的信息,请参见《Cortex&trade;-M4F 技术参考手册》。

C语言里的&和*的简单作用理解

##C语言里的&amp;和*的简单作用理解 **自己在C里,关于&amp;与*的作用老是迷糊了好久,学了也是忘记,所以在此再做笔记,以便给有同样困扰的小白一起学习。** 首先我们要知道,一个变量存在计算机中主要由指针(指针就是地址)和本身数值构成,例如: int a=1; 此处的a存放在内存里的物理抽象结构就如图1所示: &amp;:用于取某个量的地址,例如&amp;a指的就是“a的地址”, ❋:用于取某个地址所对应的数值,例如*&amp;a指的就是“a的数值” 而int *a;定义的是一个地址变量

wbgeroge的博客 2311

C语言指针 & 和 *用法

指针的7个特征 写法: *号可以写在类型名后面,也可以写在变量名前面,效果是一样的。 int* x;(推荐写法) int *x; 完整写法 简写 int z; z=(int)10 int z; z=10 int* z; z=(int*)10 不能简写 怎么做++ 运算 去掉一个*后,数据宽度是多少就加多少 1个星* #include &lt;stdio.h&gt; #include &lt;string.h&gt; void fun() { char* a;

lygl35的博客 1551

c语言指针的*和&两符号的功能

指针就是地址,定义int * p ,则p即是该地址(指针)。*是取内容运算符,&是取地址运算符。可以将*p来看做一个普通变量来使用。着重体验功效如下所示:#include"stdio.h" void main() { int* p; int* q; int* r; int c=8; int a=2; //initialize pointer p=&c; printf("variability c is:%d/n/n",c); printf("After 'p=&c

指尖思维 2699

C语言 * 与 &

int a = 10; int *b = &amp;a; printf(“%d\n”, a); printf(“%d\n”, &amp;a); printf(“%d\n”, b); printf(“%d\n”, *b); 结果: 10 6487620 6487620 10 为什么&amp;a和*b的值不是一样? 变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。 于是就有了二异性。为了消除...

w2064004678的博客 2907

C语言中* & 和不写* &的区别

int a = 10; int *b = &amp;amp;a; printf(&quot;%p\n&quot;,&amp;amp;a); \\输出变量a自身地址 printf(&quot;%p\n&quot;, b); \\输出指针b中指向的地址,即a地址 printf(&quot;%p\n&quot;, &amp;amp;b); \\输出指针b自身的地址 printf(&quot;%d\n&quot;, a); \\输出变量a中数据10 printf...

m0_37768964的博客 8181

C语言中&*和*&的区别

“&amp;amp;”和“ * ”的运算优先级别相同,按自右向左的方向结合。因此“&amp;amp;p”先进行“ * ”运算,“p”相当于变量a;再进行“&amp;amp;”运算,“&amp;amp;p”就相当于取变量a的地址。“&amp;amp;a”先进行“&amp;amp;”运算,“&amp;amp;a”就是取变量a的地址,然后执行“”运算,“&amp;amp;a”就相当于取变量a所在地址的值,实际就是变量a。 #include&amp;lt;stdio.h&amp;gt...

ChenGengru的博客 2万+

C语言中,& 和* 适用场景详解

作为函数参数传递:如果需要在函数内部修改函数外部变量的值,可以将变量的地址作为参数传递给函数,从而实现对函数外部变量的修改。访问动态分配的内存:如果需要访问动态分配的内存,可以使用指针变量来保存分配的内存的地址,并使用*运算符来访问内存中存储的值。获取结构体成员的地址:如果需要获取结构体成员的地址,可以使用结构体变量的地址和成员的偏移量来计算成员的地址。访问结构体成员:如果需要访问结构体成员,可以使用结构体变量的指针和成员的名称来访问成员的值。*运算符用于获取指针所指向的内存中存储的值,即解引用运算符。

Michael 2505

C语言指针p、*p、&p、*&p、&*p符号分别代表什么意思?

在C语言中,指针是非常重要的概念。指针是一个变量,其值为另一个变量的地址。使用指针可以直接访问内存中的数据,这使得C语言非常灵活和强大。在学习C语言时相比大家都已经知道了&和*的区别了,但你知道*&p和&*p又代表什么吗?

weixin_40365379的博客 1万+

C语言之*与&

例如: int *ptr;表示 ptr 是一个指向 int 类型数据的指针。

CherryXieのblog 3371
上一篇: Flume实例二 | 监控服务器Lynis日志上传远端hbase | 联级 | avro
下一篇: C语言 | 预处理 | 宏定义 | #define | 定义函数
stone_fall
博客等级 码龄9年 230粉丝 256原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值