C:int型指针

article/2025/5/1 20:23:09

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

环境:mint 13 64bit,gcc 4.6.3。  
如无特殊,均为`gcc test.c -o test`的类似方式编译源文件。  

在这里主要讨论`int*`,`int**`,`char*`,`char**`等这些比较基本的指针类型,主要以int类型为示例。在64bit环境中地址用8B表示,int类型是4B。

关于直接寻址、间接寻址


参见相关汇编语言、计算机组成原理的书籍。

关于int *


`int *p`定以了一个整型指针变量p,p本身存放的是一个int变量的地址,即在32位机器上int变量为2Bytes,p实际为4Bytes,因为地址要用32bits表示。  
若有以下代码: 

#include <stdio.h>
int main()
{int *p;printf("%p\n",p);printf("%d\n",*p);return 1;                       
}
编译时会提示:`warning: ‘p’ is used uninitialized in this function [-Wuninitialized] `。  
运行时显示:
(nil)
Segmentation fault (core dumped)
这是因为声明p时候,分配的8个字节原先的内容并没有被抹去,故p指向的内容不定,甚至指向内核,这是OS不允许的。  
下面这段代码就可以正常运行:
#include <stdio.h>
int main()
{int i;  //默认初始化为0int *p=&i;printf("%p\n",&i);  //打印int变量i的地址printf("%p\n",&p);  //打印int指针变量p的地址printf("%p\n",p);   //打印p本身的内容printf("%d\n",*p);  //打印p本地代表的内存地址指向的值,即i的值。return 1;                       
}
运行结果为:(注意内存对齐的概念)
0x7fffcbaecf5c
0x7fffcbaecf50
0x7fffcbaecf5c
0
内存组织如下:从内存0x7fffcbaecf5c处开始4个Byte存放int变量i,从0x7fffcbaecf50开始的8个Byte开始int指针变量p的值,而这个值对应的内存单元在使用*p取值时只会取4个Byte。调用i时候类似直接寻址,调用`*p`时候类似间接寻址。因为p是`int`型指针。注意`int i;int*p=&i;`与`int i;int *p;p=&i;`是等价的,从这个角度来讲,可以把`int *`单独看作一种类型。虽然`int i;(int *)p=&i;`是错误的,但是比较容易理解(至少对我而言),例如在经典的交换数值问题上:
#include <stdio.h>
void swap(int *p1,int *p2);
int main()
{int i=0,j=1;swap(&i,&j);printf("i=%d,j=%d\n",i,j);return 1;                       
}
void swap(int *p1,int *p2)
{int temp;temp=*p2;*p2=*p1;*p1=temp;    
}
对于swap函数的参数`int *p1`,`int *p2`,只看p1、p2,两者是int型指针,本身代表地址。 所以调用的时候需要把地址填入里面,也就是&i、&j,注意i和j必须是int类型。  
在上面的swap代码修改如下:  
#include <stdio.h>
void swap(int *p1,int *p2);
int main()
{int i=0,j=1;printf("i addr:%p ,value:%d ; j addr :%p ,value:%d \n",&i,i,&j,j);swap(&i,&j);printf("i addr:%p ,value:%d ; j addr :%p ,value:%d \n",&i,i,&j,j);return 1;                       
}
void swap(int *p1,int *p2)
{printf("p1 value:%p , p2 value:%p ; *p1 value :%d , *p2 value:%d \n",p1,p2,*p1,*p2);int temp;temp=*p2;*p2=*p1;*p1=temp;   printf("p1 value:%p , p2 value:%p ; *p1 value :%d , *p2 value:%d \n",p1,p2,*p1,*p2);
}
输出可能如下:


i addr:0x7fff6ce4b608 ,value:0 ; j addr :0x7fff6ce4b60c ,value:1 
p1 value:0x7fff6ce4b608 , p2 value:0x7fff6ce4b60c ; *p1 value :0 , *p2 value:1 
p1 value:0x7fff6ce4b608 , p2 value:0x7fff6ce4b60c ; *p1 value :1 , *p2 value:0 
i addr:0x7fff6ce4b608 ,value:1 ; j addr :0x7fff6ce4b60c ,value:0
可以看出,在main()中调用swap()时候传递的是地址。如

http://chatgpt.dhexx.cn/article/HET53Wig.shtml

相关文章

java float强制转换int类型_float型怎样强制转换成int型

展开全部 运行时所有数据都存储在内存中&#xff0c;32313133353236313431303231363533e4b893e5b19e31333436316236所以相同很正常&#xff0c;float转int会将小数后面的数舍去。 比如定义了一个floata&#xff0c;强制转换成int可写成(int)a。如果是一个表达式&#xff0c;那么…

mysql int 可以是负数吗_int型包括负数吗

展开全部 可以包含负值也可以不包含负值。 在计算机科学中&#xff0c; int()函数是整e69da5e887aa62616964757a686964616f31333433623235数数据类型的数据&#xff0c;积分数据类型可以具有不同的大小&#xff0c;并且可以允许或不允许包含负值。 整数通常在计算机中表示为一组…

int型溢出问题

目录 问题原理奇怪的循环计算机的编码循环的产生 如何识别溢出乘法加法 参考文献 问题 在执行乘法时&#xff08; i ! ∗ 2 i , ( i 0 , 1 , . . . , n − 1 ) i!*2^{i},(i0,1,...,n-1) i!∗2i,(i0,1,...,n−1)&#xff09;&#xff0c;当计算的值超过了int上限后却变成了负数…

C++中int型和string型的相互转换

一、int型转string型 1、to_string函数&#xff0c;头文件#include<string> c11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string to_s…

ArcGIS:使用栅格计算器修改特定条件下的值,如将小于100的数修改为0

使用ArcGIS中的栅格计算器可以将特定条件的值进行修改&#xff0c;如原来栅格值的范围为10-1000&#xff0c;可以通过条件语句将其修改为10-100。 修改的时候需要用到栅格计算器中的con条件语句&#xff0c;用法如下&#xff1a; con(条件,满足条件的部分赋值赋值,不满足条件的…

arcgis栅格计算器python教程_arcgis栅格计算器的使用

原标题&#xff1a;arcgis栅格计算器的使用 arcgis栅格计算器的使用 栅格计算器的灵活运用可以解决获取的数据的很多问题和应用。 以dem高程数据为例&#xff0c;可以运用栅格计算器可以直接获取坡度坡向等结果&#xff0c;但是很多时候是需要连续计算多次获得想要的结果。 …

arcgis栅格计算器:将栅格图层指定值设置为Nodata及栅格图层求交

1. 首先需要找到栅格计算器的位置 2. 将栅格图层的某个数据设置为Nodata setnull函数可将特定的栅格值赋值为空值 SetNull("这里是栅格图像名称"0 & 4,1)说明&#xff1a; 将栅格图像中0和4的栅格设置为Nodata&#xff0c;并将其他值设置为1。 结果显示&#x…

【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总

栅格计算器(Raster Calculator) 是一种空间分析函数工具,可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。只有熟练的运用并记忆一些常用的公式,才能很好的运用栅格计算器。在使用的过程中,容易出现这样那样的问题,本文就把栅…

C# VS2010 ArcEngine 栅格计算器

本来一开始我的想法是把栅格计算器中的几种功能都封装起来&#xff0c;最后拼成栅格计算器的完整功能&#xff0c;但在实践过程中我不得不面对&#xff0c;这样造成的代码的复杂度上升&#xff0c;公式只能一步步计算的问题。最终使用了GP工具中的RasterCalculator。 注意&…

arcgis栅格计算器python教程_ArcGIS教程:栅格计算器

摘要 在类似计算器的界面中&#xff0c;使用Python语法构建和执行单个地图代数表达式。 插图 用法 栅格计算器工具用于创建和执行地图代数表达式以输出一个新的栅格数据。 可在图层和变量列表中选择要用在表达式中的数据集和变量。并且&#xff0c;通过在工具对话框中单击相…

arcgis 利用栅格计算器计算 土地转移矩阵

可以前往“地信遥感数据汇”获取更多数据。 https://www.gisrsdata.com/ 如果你要做土地利用变化的研究&#xff0c;那就会用到土地转移矩阵。而土地利用转移矩阵常规有两个办法。 第一种办法就是利用ENVI里面的change detection statics工具。 第二种办法就是利用arcgis里面…

基于arcgis栅格计算器进行连续时间序列NDVI的Slope趋势分析

一、趋势分析法简介 趋势分析法是一种通过对随时间变化的变量进行线性回归分析&#xff0c;从而来预测其变化趋势的方法。其计算方法如下&#xff1a; 式中&#xff0c;Slope为像元回归方程的斜率&#xff0c;NDVI i为第i年的NDVI的平均值&#xff0c;n为研究的时间长度,视自…

【使用ArcGIS的栅格计算器批量计算波段】

使用ArcGIS的栅格计算器批量计算波段 一、先建立一个模型1.1 创建变量 二、将栅格计算器工具拖进模型里面&#xff0c;将路径安排好。保存模型。三、勾选模型参数。四、在目录里面找到该模型&#xff0c;右键选择 “批处理”五、将这一行选中&#xff0c;粘贴中Excel中六、根据…

ArcGIS 栅格计算器 Con用法

ArcGIS 栅格计算器 Con用法 前言栅格计算器 Con函数用法ArcGIS 案例操作 关注公众号&#xff0c;分享GIS知识、ArcGIS教程、SCI论文与科研日常等 前言 栅格计算器 栅格计算器界面如图&#xff0c;主题包括五部分&#xff1a;1&#xff09;ArcGIS加载的图层&#xff1b;2&…

【ArcGIS】模型构建--保姆级教程|批量掩膜、栅格计算器、裁剪、波段集统计等

问题来源&#xff1a; 在进行数据处理时&#xff0c;我们会需要对多年数据进行处理&#xff0c;或者是一年的多个实相的数据进行处理&#xff0c;那么如何批量、少手动的操作呢&#xff1f; 说在前面&#xff1a; 1&#xff1a;采用的ArcGIS10.0. 2&#xff1a;以批量掩膜提取…

【ArcGIS风暴】ArcGIS10.6栅格计算器(Raster Calculator)用法详解

扩展阅读: 【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版) 【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总 文章目录 1. 栅格计算器简介2. 栅格计算器用法3. 简单算术运算4. 数学函数运算5. 空间分析函数运算1. 栅格计算器简…

【ArcGIS自定义脚本工具】批量执行栅格计算器

文章目录 一、功能介绍二、脚本代码三、工具参数四、用例4.1 批量单位换算4.2 批量计算植被覆盖度4.3 批量填充空值 系列文章目录&#xff1a; ArcGIS自定义脚本工具 一、功能介绍 功能 将多个栅格文件按照某以代数表达式执行栅格计算器(Raster Calculator) 工具&#xff0c;并…

ArcGIS ModelBuilder批量栅格计算器

利用ArcGIS的Model Builder批量进行栅格计算 问题描述&#xff1a;利用批量栅格计算器对文件夹中的多张栅格影像的值进行去0处理。 操作步骤&#xff1a; 1、打开ModelBuilder工具&#xff0c;插入“栅格迭代器”&#xff0c;设置输入参数。 图1 ModelBuilder工具位置 图2 …

QGIS栅格数据处理工具(1):栅格计算器

相较于ArcGIS的栅格计算器&#xff0c;QGIS的栅格计算器效率更高&#xff0c;尤其是对于分辨率高的大影像(GF2、GF6)&#xff0c;因此遇到此类问题(如指数反演)我基本上使用QGIS计算。QGIS栅格计算器的语法更接近python的语法&#xff0c;下面选择1景landsat8影像使用QGIS的栅格…

arcGIS python两个栅格数据,栅格计算器进行栅格代数计算。 信息熵(区位熵)计算

arcGIS python两个栅格数据&#xff0c;栅格计算器进行栅格代数计算。 下载链接&#xff1a;多个栅格数据进行代数运算实例demo 信息熵&#xff08;区位熵&#xff09;计算公式&#xff1a; #-*- coding:UTF-8 -*- import arcpy from arcpy import env from arcpy.sa impor…