C语言笔记20

embedded/2024/10/19 4:06:51/

指针运算


#include <stdio.h>int main()
{char ac[] = {0,1,2,3,4,5,6,7,8,9,};char *p = ac;printf("p =%p\n", p);printf("p+1=%p\n", p+1);int ai[] = {0,1,2,3,4,5,6,7,8,9,};int *q = ai;printf("q =%p\n", q);printf("q+1=%p\n", q+1);return 0;
}

result:

  • p =0xbffbad5a
  • p+1=0xbffbad5b
  • q =0xbffbad2c
  • q+1=0xbffbad30

sizeof(char)=1;sizeof(int)=4,

给指针加1表示要让指针指向下一个变量

如果指针不是指像一片连续分配的空间(如数组),这种运算就没有意义

还可以对指针做的算术运算:

给指针加、减一个整数(+ += - -=)

递增递减(++ --)

两个指针相减(结果是两地址的差除以sizeof内的类型)

*p++

取出p的那个数据来,并将p移到下一个位置去

*的优先级低于++

常用于数组类的连续空间操作

在某些CPU上,还可以直接被编译成一条汇编指令

char ac[] = {0,1,2,3,4,5,6,7,8,9,-1};

char *p = &ac[0];

int i;

法一:for ( i=0; i<sizeof(ac)/sizeof(ac[0]); i++ ) {

                printf("%d\n", ac[i]);

           }

法二:while ( *p != -1 ) {        //for ( p=ac; *p=-1; ) {

                printf("%d\n", *p++);

            }

            int ai[] = {0,1,2,3,4,5,6,7,8,9,};

            int *p = ai;

指针比较

< <= == > >= !=都可以对指针做,比较它们在内存中的地址

数组中单元的地址肯定是线性递增的



0地址

内存中有0地址,但0地址通常是个不能随便碰的地址,所以指针不应该具有0值

因此可以用0地址来表示特殊的事情:

  • 返回指针是无效的
  • 指针没有被真正初始化(先初始化为0)

NULL是一个预定义的符号,表示0地址

指针的类型

无论指向什么类型,所有的指针的大小都是一样的,因为都是地址,但是指向不同类型的指针是不能直接互相赋值的(避免用错指针)

指针的类型转换

void*表示不知道指向什么东西的指针,计算时与char*相同(但不相通)

指针也可以转换类型:eg.  int *p = &i; void*q = (void*)p;

这并没有改变p所指的变量的类型,而是让后人用不同眼光通过p看它所指的变量

小结

指针的作用

需要传入较大的数据时用作参数

传入数组后对数组做操作

函数返回不止一个结果,需要用函数来修改不止一个变量

动态申请的内存

……


http://www.ppmy.cn/embedded/128645.html

相关文章

状态模式(C++)

定义&#xff1a;状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。状态模式将状态相关的行为封装到单独的类中&#xff0c;并将这些对象组合成状态模式&#xff…

Nginx:proxy_pass指令

proxy_pass 指令在 Nginx 中是实现反向代理和负载均衡的重要指令。 一. 反向代理 在反向代理的场景下&#xff0c;proxy_pass 指令用于将接收到的请求转发给另一个后端服务器。后端服务器地址可以是 IP 地址加端口、域名加端口、或者一个完整的 URL。 注意事项 proxy_pass …

Python近红外光谱数据分析技术

原文链接&#xff1a;Python近红外光谱数据分析技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247618985&idx4&sncb10b44822eeb8e30eadd9e45fbdcdc4&chksmfa82504ecdf5d9584a78de0adfc518c159baf1b70b26106a621adf1aa0bfaf1c67b7203e4b7c&toke…

K8s(学习笔记)

swap分区是什么呀&#xff1f; 什么是ipvs呀&#xff1f; yaml是什么呀&#xff1f;&#xff1f;&#xff1f; p20看不下去了&#xff01;&#xff01;&#xff01;

Springboot集成Kafka

一、添加依赖 我们使用spring本身支持的spring-kafka依赖&#xff0c;但是需要注意版本问题&#xff0c;不同的springboot版本支持不同的kafka版本&#xff0c;避免因版本不同带来困扰&#xff01;参考下图&#xff1a; 或者访问官网查看版本对应关系&#xff1a;Spring for Ap…

浅谈C++之日志记录

在 C 中使用 log4net 进行日志记录&#xff0c;您需要遵循以下步骤&#xff1a; 安装 log4net&#xff1a; 首先&#xff0c;您需要在您的 .NET 项目中包含 log4net 库。通常&#xff0c;这可以通过 NuGet 包管理器来完成。 配置 log4net&#xff1a; 您需要创建一个配置文件…

WebServer构建响应 发送响应

1.构建响应 构建响应流程如下 确认方法根据不同方法&#xff0c;以不同方法提参确认访问资源如果用户的URL没有指明要访问的某种资源(路径)&#xff0c;虽然浏览器默认会添加/&#xff0c;但是依旧没有告知服务器&#xff0c;要访问什么资源 此时&#xff0c;默认返回对应服务…

【Qt】继承自QItemDelegate的代理类是如何工作的?

在 Qt 中&#xff0c;继承自QItemDelegate的代理类主要使用createEditor 和 setEditorData 方法&#xff1a; 创建编辑器&#xff1a;当用户开始编辑一个项时&#xff08;例如通过双击一个单元格或者通过其他方式触发编辑&#xff09;&#xff0c;视图会调用委托的 createEdit…