08 C语言指针
创始人
2024-06-01 00:24:40
0

08 C语言指针

1、取地址运算

  1. 取地址运算符 & 是一元运算符,用于返回一个变量或对象在内存中的地址。例如,如果有一个名为x的变量,那么&x将返回x在内存中的地址。除了对变量进行取地址运算,还可以对指针变量进行取地址运算,得到指针变量本身的地址。例如,如果有一个名为p的指向int类型变量的指针变量,那么&p将返回p在内存中的地址。
  2. 取地址运算符 & 只能对具有内存地址的变量进行操作,因为只有变量才会在内存中占用一定的空间,才能有地址。因此,不能对常量、表达式、函数名等进行取地址运算。
  3. 取出来的地址大小取决于编译器和处理器的架构。在32位系统中,地址通常是4字节长,而在64位系统中,地址通常是8字节长。在一些嵌入式系统中,地址可能只有2字节或更少。
  4. 为了打印地址,可以使用 %p 格式化字符,例如:printf(“The address of x is %p”, (void*)&x); 在使用%p格式化字符打印地址时,需要将地址强制转换为void指针类型,这是因为%p只接受void指针类型的参数。
  5. 在内存中,变量地址是按照从低地址到高地址的顺序分布的,自底向上分布。数组名是数组首个元素的地址,而相邻的数组元素的地址之间相差一个数据类型的大小。例如,如果一个整数数组的第一个元素的地址为0x1000,那么第二个元素的地址为0x1004(如果是32位系统),第三个元素的地址为0x1008,以此类推。指针变量也是如此,指针变量在内存中的地址也是按照从低地址到高地址的顺序分布的,自底向上分布。

2、指针变量

  1. int *p 的含义是 p 是一个指向 int 类型变量的指针变量,而不是指针存放的地址是 int 类型。
  2. 指针变量存储的值是一个内存地址,它指向一个具有有效值的普通变量。
  3. 当一个指针被解引用时,使用指针所指向的地址读取或写入该地址中存储的值。
  4. * 作为一元运算符,可以用于访问一个指针变量所指向地址中存储的值。作为左值进行赋值时,可以修改指针变量所指向地址中存储的值。
  5. & 运算符可以取出一个变量的内存地址,而 * 运算符可以通过一个指针变量访问该地址中存储的值。它们是相互关联的操作,但并不是相互反作用的。

3、指针的应用场景

1、交换两个变量。

2、函数返回值不止一个;传入的参数就是需要保存带回来的结果。

2、函数返回运算状态,结果用指针返回。

指针必须指向一个变量,否则直接访问会对不明确的地址进行访问,会有严重错误。

4、指针与数组

1、在函数的参数列表里面,数组int a[] == int * == int *a,但是可以通过[]进行数组运算。

2、数组变量是const指针,所以无法把一个数组直接赋值给另一个数组,因为数组变量存放的地址是数组首个变量的地址,为常量不可以修改。

3、[]和*符号可以对数组进行操作,可以对指针进行操作。

5、指针与const

1、指针本身可以是const,变量本身也可以是const

2、* const 表示的是指针是const,*const p = q说明,p当中只能是q的地址,不可被修改。类似于数组a[10]当中,a[]和a表达的是 * const ,指针常量不可修改

3、const *表示不可以通过指针去改变变量,但指针所指的变量不会变成const

4、传参数的时候可以使用const*避免变量被修改。

5、const int a[10],表面数组的每个变量都是const,所以必须初始化才能赋值。

6、在传参数的时候防止数组被破坏,可以将数组参数设置为const。

6、指针计算

  1. *p++ 这个表达式会先取出指针 p 指向的地址上的值,然后将指针 p 加上它指向的数据类型的大小,指向下一个地址。例如,如果 p 是一个 int 类型的指针,那么 *p++ 将会先取出 p 所指向地址上的 int 值,然后将 p 加上 sizeof(int),指向下一个 int 类型的地址。
  2. 两个指针相减得到的是它们之间相差的地址数量,也就是它们之间隔了多少个数据类型大小的空间。例如,如果 p1p2 都是 int 类型的指针,那么 p2 - p1 的结果将是两个指针之间隔了多少个 int 类型的大小。这个值通常被称为指针之间的偏移量。
  3. *p++ 表达式的执行过程是先取出 p 所指向地址上的值,然后将 p 加上它指向的数据类型的大小,指向下一个地址。因此,*p++ 的结果是取出 p 所指向地址上的值。这个表达式实际上等价于 *(p++)
  4. 不同类型的指针之间不能相互赋值,这是因为不同类型的指针所指向的内存结构是不同的。即使它们的地址大小相同,它们指向的数据类型也可能不同,因此在使用指针的时候需要格外小心,避免出现类型不匹配的问题。

7、动态内存分配

  1. 数组动态申请内存int *p =(int *)malloc(sizeof(int) * n) 这行代码的意思是,申请一个长度为n的int类型数组,p指向这段内存的首地址。由于malloc返回的是void类型指针,需要进行强制类型转换。
  2. 动态申请的内存是字节为单位的。 malloc函数申请的内存是以字节为单位的,因此需要通过sizeof运算符计算需要申请的字节数。
  3. 如果申请失败了,返回的是0 如果内存申请失败,malloc函数会返回一个NULL指针。因此,我们需要在申请内存后检查返回值是否为NULL,以确定是否申请成功。
  4. 申请完地址,需要free,malloc和free参数需要一致。 在动态内存分配中,申请到的内存空间需要手动释放。使用free函数可以释放已申请的内存。需要注意的是,释放内存时需要确保指针参数与申请内存时返回的指针参数一致,否则会出现不可预料的问题,甚至导致程序崩溃。

相关内容

热门资讯

沈阳市组织开展第二届“绿美沈城... 转自:沈阳日报  本报讯(沈阳日报、沈报全媒体记者张一弛)4月27日,由市委社会工作部、市城管执法局...
2025年沈阳市“游泳苗子”选... 转自:沈阳日报  本报讯(沈阳日报、沈报全媒体记者丁瑶瑶)4月26日,2025年沈阳市青少年游泳比赛...
“五一”假期国铁沈阳局预计发送... 转自:沈阳日报  本报讯(沈阳日报、沈报全媒体记者张晓宁 通讯员刘健楠、郭爽)4月27日,记者从中国...
牢固树立依法治税理念 持续提升... 转自:天津日报  本报讯(记者 徐丽)日前,市人大常委会主任喻云林到国家税务总局天津市税务局,就推动...
新经典2025年一季度财报解读... 2025年第一季度,新经典文化股份有限公司(以下简称“新经典”)交出了一份并不乐观的成绩单。文学类图...
损坏的是绿化 更是文明(图) 转自:天津日报  近日,河西区复兴河沿岸及红桥区青年路附近,多次出现居民不文明采摘槐花、榆树叶的现象...
金能科技2025年一季度财报解... 2025年第一季度,金能科技股份有限公司(以下简称“金能科技”)在营收、利润及现金流等方面呈现出一系...
第三轮间接会谈 美伊仍存分歧 转自:沈阳日报  伊朗与美国26日在阿曼首都马斯喀特举行了第三轮间接会谈,会谈持续约6小时后结束。伊...
泺口服装城五一邀您共同开启消费...   张晓燕 济南报道  经过多年蝶变,济南泺口服装城以全新姿态迎接消费升级浪潮。记者了解到,5月1日...
苏家屯区开展监管行动全力护航“... 转自:沈阳日报  本报讯(沈阳日报、沈报全媒体记者李莉)苏家屯区市场监管部门日前针对节日热销产品和重...
“小标签”里的“温度” 转自:沈阳日报  “李姐,电子装户图上苏姨是‘慢性病基础病患者’,咱们得重点跟进健康情况;张奶奶是‘...
当我再次牵起你的手 转自:沈阳日报  □般  若  醒来依然是天黑。上班的地方离家里有一小时车程,东北的冬天里,我要凌晨...
中超9轮战罢 海牛队一胜难求 转自:天津日报  本报讯(记者 顾颖)中超联赛第9轮昨晚全部结束,8轮过后排名积分榜倒数第一位的青岛...
陶渊明的劳动颂歌 转自:天津日报  陶渊明“归去来兮”,世人皆以为他归隐田园,不过是寻一处清静,以避世乱。殊不知,他那...
青年突击队擎旗出征科创主战场(... 转自:天津日报  本报讯(记者 王音)五四青年节即将到来之际,昨天上午,“善作善成 青春出列”纪念五...
京津中关村科技城入驻市场主体1... 转自:天津日报  本报讯(记者 杜洋洋)昨日,宝坻区区长郭康伟做客“向群众汇报——2025区长访谈”...
1000余家创新主体开展人才自... 转自:天津日报  本报讯(记者 马晓冬)记者从市政府新闻办昨日召开的新闻发布会上获悉,天津自贸试验区...
(上接A13版)   除此之外,特朗普重组国务院的计划中,还涉及大幅缩减驻加拿大使馆规模的内容,并且设立新的、由国务卿...
城市“年轮”(图) 转自:天津日报  在天津人心中,海河孕育了津门独特的河海文化,既见证了城市的发展轨迹,也倒映着时代变...
广信股份2024年年报解读:营... 2025年4月25日,安徽广信农化股份有限公司(以下简称“广信股份”)发布2024年年度报告。报告期...