news 2026/5/12 21:15:54

C语言-指针二

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言-指针二

一. 指针的操作

int main() { int a = 10 , b = 20, c = 30; int *p = NULL, *q = NULL; p = &a;//对指针变量p本身进行修改 b = *p;//*p为右值表示对变量a的读取 *p = 60;//*p为左值表示通过指向的内存空间对变量a的写入 p = &c;//p指向的内存空间发生变化 b = *p;//对c的读取操作 *p = 70;//对c的写入操作 q = p;//将p的值赋值给q return 0; }

二. 函数的传址调用

函数的传值调用:函数的形参是实参的一份临时拷贝,修改形参不会改变实参。

函数的传址调用:形参是实参的地址,形参指向实参的内存地址,可以通过形参来改变实参。

要使用函数传址调用的两种方式:

1. 需要形参修改实参的情况。需要被调函数修改主调函数中数据的值。
2. 函数的返回值只有一个。 在被调函数中,需要返回多个数据的话,就需要传递值指针。因为在

被调函数中可以修改主调函数的参数值

2.1 两数交换

void swap(int *pa, int *pb) { int temp = *pa; *pa = *pb; *pb = temp; } int main() { int a = 0, b = 0; printf("input a and b:"); scanf("%d %d",&a,&b); printf("before a = %d,b = %d\n",a,b); swap(&a,&b); printf("after a = %d,b = %d\n",a,b); return 0; }

通过传变量的地址,可以使用函数实现两个变量的交换。

传值调用则不行,因为形参是实参的一份临时拷贝,修改形参并不会改变实参。

2.2 函数的传出参数

使用函数的传址调用也可以在函数内部修改特定的值,方便在主调函数中的使用。

传出参数:给函数一个地址,在函数内部对其进行修改,之后可以在主调函数中访问。

eg:使用一个函数计算两数的加减法

void func(int a, int b, int *sum, int *sub) { *sum = a + b; *sub = a - b; } int main() { int a = 0, b = 0, sum = 0, sub = 0; printf("input a and b:"); scanf("%d %d", &a, &b); func(a, b, &sum, &sub); // printf("a + b = %d\n", sum); printf("a - b = %d\n", sub); return 0; }

三. 指针和数组

3.1 指针和数组的关系

1. 数组名是一个指向数组第一元素的指针常量(指针本身的值,不能发生变化。 指针是保存地址的 变量,指针保存的地址,不能发生变化)。
2. 数组名的类型 ,int a[]的类型是int []int [ ]约等于int *,类型兼容。
不同点:
使用sizeof()计算 int*所占字节大小时,结果是8字节。

使用sizeof()计算 int a[20] 所占字节大小时,结果是80字节。
int *p :对p取地址,结果是一个二级指针:int **(二级指针,地址的地址)
int a[10] : &a 的结果是一个数组指针: int (*p)[10]

3. 数组名表示的是数组首元素的地址,但是有两个例外:

(1)、sizeof(数组名):这里计算的是整个数组的大小

(2)、&数组名:这里取出整个数组的地址,加一跳过整个数组。

3.2 一维整型数组做参数

int fill_array(int *a, int size) { int i = 0; for(i = 0; i < size; i++) *(a + i) = rand()%20; return 0; } int show_array(int *a, int size) { int i = 0; for(i = 0; i < size; i++) printf("%d ",*(a + i)); puts(""); return 0; } //冒泡排序 void bubble_sort(int *a, int size) { int i = 0, j = 0, flag = 0; for(i = 1; i < size; i++) { flag = 0; for(j = 0; j < size - i;j++) { if(*(a + j) > *(a + j + 1)) { int temp = *(a + j); *(a + j) = *(a + j + 1); *(a + j + 1) = temp; flag = 1; } } if(!flag) break; } } //选择排序 void chose_sort(int *a, int size) { int i = 0, j = 0; for(i = 0; i < size - 1; i++) { int min_index = i; for(j = i + 1; j < size; j++) { if(*(a + j) < *(a + min_index)) min_index = j; } if(i != min_index) { int temp = *(a + min_index); *(a + min_index) = *(a + i); *(a + i) = temp; } } } //插入排序 void insert_sort(int *a, int size) { int i = 0, j = 0; for(i = 0; i < size - 1; i++) { j = i + 1; int k = *(a + j); while (j > 0 && *(a + j - 1) > k) { *(a + j) = *(a + j - 1); j--; } *(a + j) = k; } } int main() { srand(time(NULL)); int a[10] = { 0 }; int size = sizeof(a) / sizeof(a[0]); fill_array(a,size); show_array(a,size); // bubble_sort(a,size); // printf("bubble_sort:"); // show_array(a,size); // chose_sort(a,size); // printf("chose_sort:"); // show_array(a,size); insert_sort(a,size); printf("insert_sort:"); show_array(a,size); return 0; }

3.3 一维字符数组做参数

void show_array(char *a) { while(*a) { printf("%c",*(a++)); } puts(""); } int main() { char a[10] = { 0 }; printf("input a str:"); gets(a); show_array(a); return 0; }

3.4 数组指针

int a[10] = { 0 }; int (*pa)[10] = &a;

这里pa是一个数组指针,加一跳过40个字节

int a[10]; int (*pa)[10] = &a; printf("pa is %p\n",pa); printf("pa+1 is %p\n",pa+1);

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

B站缓存视频转换终极指南:m4s-converter一键将m4s文件无损合并为MP4

B站缓存视频转换终极指南&#xff1a;m4s-converter一键将m4s文件无损合并为MP4 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾因B站视…

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

原神帧率解锁技术解析:三步突破60FPS限制的完整方案

原神帧率解锁技术解析&#xff1a;三步突破60FPS限制的完整方案 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否曾为《原神》PC版的60FPS限制感到困扰&#xff1f;当你的高性能显卡…

作者头像 李华
网站建设 2026/5/12 21:09:07

大模型学习指南:收藏必备,小白也能轻松掌握AI Agent核心概念

前言 – 随着大语言模型&#xff08;LLM&#xff09;的快速普及&#xff0c;围绕 AI Agent 的工具生态正在迅速成形&#xff0c;一批新词汇也随之涌现&#xff1a;Tool、Skill、Tool Calling、MCP、CLI、skills.sh…… 这些词看起来相似&#xff0c;实则分属不同层次&#xff0…

作者头像 李华
网站建设 2026/5/12 21:05:12

AI编程助手效率革命:结构化配置与提示词工程实战

1. 项目概述&#xff1a;一个为AI编程时代量身定制的开发者工具箱如果你和我一样&#xff0c;日常开发已经离不开像 Cursor 和 Claude 这样的 AI 编程助手&#xff0c;那你肯定也遇到过类似的困扰&#xff1a;每次开启一个新项目&#xff0c;或者在不同项目间切换时&#xff0c…

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

深度学习 基于 PyQt5 和 YOLOv11 (Ultralytics) 的完整番茄叶片病害检测系统构建 YOLOV11西红柿番茄叶片病害检测系统

智慧农业巡检-【YOLOv11】番茄叶片病害智能检测系统&#xff08;全套源码数据集预训练模型&#xff09;项目概述 本系统是基于最新 YOLOv11 目标检测算法开发的番茄病害识别方案。配套自主设计的现代化简约 GUI 界面&#xff0c;响应速度快&#xff0c;操作直观。适用于农业智能…

作者头像 李华