news 2026/6/10 15:41:08

10.c语言指针初阶

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10.c语言指针初阶

内存

内存很大,里面有很多数据。

怎么知道哪些数据在哪里放着。

地址。

指针就是用来存储地址的特殊变量。指针变量=地址。

指针变量

int a = 10;

//普通的局部变量a在栈区存放

int*p1 =&a;//&是取地址符号

//p的类型取决于a的类型。a的类型+*,就可以定义指针变量

printf("%p\n",p1);//%p就是指针的占位符

//怎么通过指针变量去访问a的值?新语法

printf("%d\n",*p1);//间接访问/解引用。嘛这个输出的就是a啦。

*p1 = 99;

*p1作为等式的左值,什么意思?把a里面,原来的10,变成了99;偷家了吧,就是。

指针类型与访问

类型

char short都可以 跟int差不多的

访问

就是解引用,上面也写过的

访问指针变量所指向内存的值,修改指针变量所指向内存的值,都讲过啦。

*指针变量就可以啦。记得占位符用原来变量的,是int就用d,是char就用c,不要用p了。

当前这个指针能访问几个字节取决于变量的类型。

问题:给内存进行编址的时候,是怎么编址的?

以字节为单位进行编址(就跟,一户编一号,一样的)

指针变量的大小

不管什么类型的指针,大小都是一样的,因为地址是统一编号的,都是32个二进制位。(32位系统下)

为什么看到的是八位十六进制?显示而已。在32位系统下,一个4字节的指针,用十六进制表示就是一个八位的十六进制数。两个十六进制位正好一个字节。

64位系统不一样,都变成两倍。

指针的运算

  • 指针 +- 整数
  • 指针 - 指针
  • 指针的关系运算

指针 +- 整数

int main()

{

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

int len = sizeof(arr)/sizeof(arr[0]);

int* p = &arr[0];

printf("%p\n",p);

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

printf("%p\n",p+1);

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

return 0;

}

如果此时想要指针由0下标的数指向1下标的数,应该如何操作呢。

让p+1就可以。

p没变。p+1是一个地址,这里的加1相当于加了四个字节,从数组下标为0的位置加到了数组下标为1的位置。用%p输出的是地址。如果想输出数的话,用解引用就可以了。

指针 - 指针

int main()

{

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

int* p1 = &arr[1];

int* p2 = &arr[4];

printf("%d\n",p2 - p1);

return 0;

}

结果是3,刚好是两个数在数组里,中间隔的数的个数。

指针减指针不是随便减的。前提:两个指针必须指向同一块内存。比如不是同一个数组就减不了。

指针的关系运算

int main()

{

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

int len = sizeof(arr)/sizeof(arr[0]);

int* p1 = &arr[0];

int* p2 = p1 + len;

while(p1 < p2)

{

printf("%d ",*p1);

p1++; //p1++加的不是数值,是位置。你要把这个弯绕过来

}

return 0;

}

len现在是10,p2现在是p1加10。有点越界了,所以用小于号就好啦(不用小于等于的意思

黄色的可以改成

int* p2 =arr+ len;

int* p2 =&arr[0]+ len;

这里的数组名的含义就是数组首元的地址

注意

数组名代表 数组首元素的地址

但是有两个地方除外:

1.定义数组的时候,sizeof(arr)表示整个数组的字节大小

2.他说后续讲

int类型的指针加1是加4个字节

short类型的指针加1是加2个字节

char类型的指针加1是加1个字节

总之就是跟着类型来的,可以理解成指针加1就是加一个单位我觉得

//什么时候是定义数组,又是什么时候不算定义数组呢

//对比,在自定义函数里的len和在函数外的len

void func(int arr[])

{

// 8 / 4

int len = sizeof(arr)/sizeof(arr[0]);

printf("func :: len == %d\n",len);

}

int main()

{

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

int len = sizeof(arr)/sizeof(arr[0]);

printf("len == %d\n",len);

func(arr);

}

输出的结果是

len == 10
func :: len == 2

原因:c语言中,数组作为函数参数时,会被隐式转换为指向数组首元素的指针,int arr[]等价于int* arr

sizeof(arr)这时候计算的是指针变量的字节大小,64位系统下占8字节,32位系统下占4字节

sizeof(arr[0])依然是int类型的4个字节

补:交换的函数

之前函数那节失败的

void swap(int x,int y)//错的

{

int tmp;

tmp = x;

x = y;

y = tmp;

}

int main()

{

int a = 10;

int b = 20;

printf("%d %d\n",a,b);

swap(a,b); //错的

printf("%d %d\n",a,b);

return 0;

}

此时的形参只是拿到了实参的值,形参只是实参的一份拷贝。

拿到地址才是实打实的换。

void swap(int* px,int* py)

{

int tmp;

tmp =*px;

*px =*py;

*py = tmp;//不要忘记写*啊。不能直接换指针的地址变量的,换的是里面装的东西

}

int main()

{

int a = 10;

int b = 20;

printf("%d %d\n",a,b);

swap(&a,&b);

printf("%d %d\n",a,b);

return 0;

}

什么时候用指针,什么按值传递?

如果要改变实参本身的值,最好传地址。

不改变就按值传递就好了吧。。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:33:51

轻量级应用日志捕获与显示

在日常的软件开发中&#xff0c;日志捕获与分析是调试和故障排除的关键步骤。特别是当你需要在没有专业调试工具的环境下快速获取应用的运行状态时&#xff0c;轻量级的解决方案显得尤为重要。本文将探讨如何创建一个简单但有效的控制台应用程序&#xff0c;用于从另一本地客户…

作者头像 李华
网站建设 2026/6/10 14:34:37

YOLOFuse适合初学者吗?零基础入门多模态检测指南

YOLOFuse适合初学者吗&#xff1f;零基础入门多模态检测指南 在夜间监控画面中&#xff0c;一个模糊的热源悄然移动——可见光摄像头几乎无法辨识&#xff0c;但红外图像却清晰捕捉到了轮廓。如何让AI同时“看见”这两种信息&#xff0c;并做出更准确的判断&#xff1f;这正是多…

作者头像 李华
网站建设 2026/6/10 12:17:50

Vue.js搭建YOLOFuse可视化界面:开发者实践分享

Vue.js 搭建 YOLOFuse 可视化界面&#xff1a;开发者实践分享 在智能安防、夜间巡检和自动驾驶等现实场景中&#xff0c;单一视觉模态的感知系统常常“力不从心”——白天清晰的摄像头到了夜晚或烟雾环境中便难以识别目标。红外传感器虽能穿透黑暗&#xff0c;却缺乏纹理细节。…

作者头像 李华
网站建设 2026/6/10 14:47:23

【AI 编程】工具全维度对比解析:从选型到落地的实用指南

文章目录 目录1. 引言2. AI编程工具核心定义与价值2.1 核心定义2.2 核心价值 3. AI编程工具分类对比4. 主流AI编程工具详细剖析4.1 主流工具核心信息汇总4.2 重点工具核心优势与短板4.2.1 GitHub Copilot4.2.2 Cursor4.2.3 Codeium4.2.4 通义灵码4.2.5 CodeLlama 5. 关键维度深…

作者头像 李华
网站建设 2026/6/10 15:09:26

YOLOFuse知乎专栏开通:技术文章定期更新

YOLOFuse&#xff1a;轻量化RGB-IR融合检测的工程实践之路 在智能安防、自动驾驶和夜间监控等现实场景中&#xff0c;光照条件往往不理想——夜幕低垂、浓雾弥漫、烟尘遮挡……这些环境让依赖可见光的传统目标检测模型频频“失明”。即便YOLOv8这样的顶尖单模态模型&#xff0…

作者头像 李华
网站建设 2026/5/30 21:10:08

从零开始学组合逻辑电路设计:手把手教程

从一个开关说起&#xff1a;如何用最简单的门电路“思考”&#xff1f;你有没有想过&#xff0c;当你按下电脑开机键的那一刻&#xff0c;背后有多少个“是或否”的决定在瞬间完成&#xff1f;这些看似简单的判断&#xff0c;并非来自某个复杂的程序&#xff0c;而是由一种极其…

作者头像 李华