C 语言学习-06【指针】

news2024/11/26 21:26:16

1、目标单元与简介存取

直接访问和间接访问

#include <stdio.h>

int main(void) {
 int a = 3, *p;
 p = &a;
 printf("a = %d, *p = %d\n", a, *p);
 *p = 10;
 printf("a = %d, *p = %d\n", a, *p);
 printf("Enter a: ");
 scanf("%d", &a);
 printf("a = %d, *p = %d\n", a, *p);
 (*p)++;
 printf("a = %d, *p = %d\n", a, *p);
 return 0;
}
  • 运行结果:
    在这里插入图片描述

2、引用指针变量

引用指针变量

#include <stdio.h>

int main() {
 int a = 15;
 int *p = &a;
 printf("%d, %d\n", a, *p);
 return 0;
}
  • 运行结果:
    在这里插入图片描述

通过指针修改内存上的数据

#include <stdio.h>

int main() {
 int a = 15, b = 99, c = 222;
 int *p = &a;
 *p = b;
 c = *p;
 printf("%d, %d, %d, %d\n", a, b, c, *p);
 return 0;
}
  • 运行结果:
    在这里插入图片描述

3、指针变量作为函数参数

通过指针交换两个变量的值:

#include <stdio.h>

void swap(int *p1, int *p2) {
 int temp;
 temp = *p1;
 *p1 = *p2;
 *p2 = temp;
}

int main() {
 int a = 66, b = 99;
 swap(&a, &b);
 printf("a = %d, b = %d\n", a, b);
 return 0;
}
  • 运行结果:
    在这里插入图片描述

4、指向数组的指针

通过指针输出数组中元素的值

#include <stdio.h>

int main(void) {
 int i, a[] = {1, 3, 5, 7, 9};
 int *p = a;
 for (i = 0; i < 5; i++) {
     printf("%d\t", *(p+i));
 }
 printf("\n");
 return 0;
}
  • 运行结果:
    在这里插入图片描述

5、指向数组的指针作为函数参数

利用数组名作为参数,将数组中的 10 个整数完全颠倒顺序:

#include <stdio.h>

void inv(int *x, int n);

int main() {
 int i, a[] = {3, 7, 9, 11, 0, 6, 7, 5, 4, 2};
 printf("The original array: \n");
 for (i = 0; i < 10; i++) {
     printf("%3d", a[i]);
 }
 printf("\n");
 inv(a, 10);
 printf("The array has been inverted: \n");
 for (i = 0; i < 10; i++) {
     printf("%3d", a[i]);
 }
 printf("\n");
 return 0;
}

void inv(int *x, int n) {
 int t, *i, *j;
 for (i = x, j = x + n - 1; i <= j; i++, j--) {
     t = *i;
     *i = *j;
     *j = t;
 }
 return;
}
  • 运行结果:
    在这里插入图片描述

6、字符串指针

八进制转换成十进制:

#include <stdio.h>

int main(void) {
 char *p, s[6];
 int n;
 n = 0;
 p = s;
 printf("Enter the octal number you want to convert: \n");
 gets(p);
 while (*(p) != '\0') {
     n = n * 8 + *p - '0';
     p++;
 }
 printf("The converted decimal number is: \n%d\n", n);
 return 0;
}
  • 运行结果:
    在这里插入图片描述

7、指针复制字符串

字符串复制:

#include <stdio.h>

int main(void) {
    char str1[10], str2[10];
    char *p1, *p2;
    p1 = str1;
    p2 = str2;
    printf("Please enter the original string: \n");
    gets(p2);
    for (; *p2 != '\0'; p1++, p2++) {
        *p1 = *p2;
    }
    *p1 = '\0';
    printf("The original string is %s\n, and the copied string is %s\n", str2, str1);
    return 0;
}
  • 运行结果:
    在这里插入图片描述

字符串连接:

#include <stdio.h>

int main(void) {
    char str1[10], str2[10], str[10];
    char *p1, *p2, *p;
    int i = 0;
    p1 = str1;
    p2 = str2;
    p = str;
    printf("Please enter the str1: \n");
    gets(p1);
    printf("Please enter the str2: \n");
    gets(p2);
    while (*p1 != '\0') {
        *p = *p1;
        p += 1;
        p1 += 1;
        i++;
    }
    for (; *p2 != '\0'; p1++, p2++, p++) {
        *p = *p2;
    }
    *p = '\0';
    printf("str1 is %s\nstr2 is %s\nAfter connection is: %s\n", str1, str2, str);
    return 0;
}
  • 运行结果:
    在这里插入图片描述

已知一个字符串,使用返回指针的函数,实现把该字符串中的 ‘*’ 号删除,同时把后面连接的字符串前移

#include <stdio.h>
#include <string.h>

char *strarrange(char *arr) {
    char *p = arr;
    char *t;
    while (*p != '\0') {
        p++;
        if (*p == '*') {
            t = p;
            while (*t != '\0') {
                *t = *(t + 1);
                t++;
            }
            p--;
        }
    }
    return arr;
}

int main(void) {
    char s[] = "abc*def***ghi*jklmn";
    char *p;
    p = s;
    printf("Before deletion, the character string is: %s\n", p);
    printf("After deletion, the character string is: %s\n", strarrange(p));
    return 0;
}
  • 运行结果:
    在这里插入图片描述

8、函数指针

指向函数的指针:

#include <stdio.h>

int max(int x, int y) {
    int z;
    if (x > y) {
        z = x;
    } else {
        z = y;
    }
    return z;
}

int main(void) {
    int(*p)(int, int);
    int a, b, c;
    p = max;
    printf("Enter the values of a and b\n");
    scanf("%d %d", &a, &b);
    c = (*p)(a, b);
    printf("The larger value of %d and %d is: %d\n", a, b, c);
    return 0;
}
  • 运行结果:
    在这里插入图片描述

9、使用 const 修饰指针变量

  • const 类型 *变量名:可以改变指针的指向,不能改变指针指向的内容
  • 类型 * const 变量名:可以改变指针指向的内容,不能改变指针的指向
  • const 类型 * const 变量名:指针的指向、指针指向的内容都不可以改变

10、数值排序

实现将 3 个数值进行降序排列:

#include <stdio.h>
#include <stdlib.h>

void fun(int *a, int *b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void exchange(int *a, int *b, int *c) {
    if (*a < *b) fun(a, b);
    if (*a < *c) fun(a, c);
    if (*b < *c) fun(b, c);
}

void main() {
    int *p1 = (int*)malloc(sizeof(int));
    int *p2 = (int*)malloc(sizeof(int));
    int *p3 = (int*)malloc(sizeof(int));
    printf("Please input 3 numbers: \n");
    scanf("%d %d %d", p1, p2, p3);
    exchange(p1, p2, p3);
    printf("Output: \n");
    printf("*p1 = %d\t*p2 = %d\t*p3 = %d\n", *p1, *p2, *p3);
    free(p1);
    free(p2);
    free(p3);
}
  • 运行结果:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow单身杯2024wp

文章目录 ctfshow单身杯2024wp签到好玩的PHPezzz_sstiez_inject ctfshow单身杯2024wp 签到好玩的PHP 考点&#xff1a;序列化反序列化 <?phperror_reporting(0);highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public …

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》&#xff0c;从原理出发&#xff0c;直击面试难点&#xff0c;实现更高维度的降维打击&#xff01; 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

【Mybatis】@Param注解 resultMap手动映射

文章目录 一、映射文件参数二、查询映射2-1 一对一2-2 一对多2-3 总结 一、映射文件参数 Param 注解官方文档解释 1、单个参数&#xff08;对象&#xff09;不使用注解 public int save(User user);<!-- 添加用户 --> <insert id"save" parameterType&quo…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计

风尚云网前端学习&#xff1a;一个简易前端新手友好的HTML5页面布局与样式设计 简介 在前端开发的世界里&#xff0c;HTML5和CSS3是构建现代网页的基石。本文将通过一个简单的HTML5页面模板&#xff0c;展示如何使用HTML5的结构化元素和CSS3的样式特性&#xff0c;来创建一个…

STM32WB55RG开发(5)----监测STM32WB连接状态

STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…

RK356x-10:串口(uart)配置与调试

本文记录RK3566/RK3568通用异步串口(uart)的配置与调试过程 1. 配置uart节点 1.1 在rk3568.dtsi中已经定义了uart0,uart1...&#xff0c;根据电路图&#xff0c;确定需要使用的是哪个串口&#xff0c;比如我使用的是uart0&#xff0c;在另外一个与我们自己主板相关的dtsi文件&…

【C++】从C到C++

C和C一些语法区别 1.三目运算符&#xff1a;在C语言中返回的是一个常量&#xff0c;是不能被赋值的&#xff1b;而C中返回的是变量&#xff0c;可以被赋值 2.C中的函数必须要写返回值类型 3.在全局下&#xff0c;C不允许int a;和int a10;等这种重定义二义性操作 4.在C中不要…

WSL安装不同版本ubuntu(已有ubuntu20.04,再装ubuntu18.04)

参考&#xff1a; 如何在 WSL 中删除指定版本的 Ubuntu&#xff08;以删除 Ubuntu 22.04 为例&#xff09;_wsl卸载某个-CSDN博客 已有ubuntu20.04&#xff0c;现在再安装一个ubuntu18.04 直接参考下面我写的链接的第四步&#xff0c;前面的步骤都不需要再做了 Win11安装WSL…

《硬件架构的艺术》笔记(七):处理字节顺序

介绍 本章主要介绍字节顺序的的基本规则。&#xff08;感觉偏软件了&#xff0c;不知道为啥那么会放进《硬件架构的艺术》这本书&#xff09;。 定义 字节顺序定义数据在计算机系统中的存储格式&#xff0c;描述存储器中的MSB和LSB的位置。对于数据始终以32位形式保存在存储器…

wkhtmltopdf的安装与使用

本文来记录下wkhtmltopdf的安装与使用 文章目录 概述下载路径安装配置wkhtmltopdf 参数详解代码实现本文小结 概述 将html转为pdf的组件有很多&#xff0c;但是还没有哪一款能达到这个效果&#xff0c;其只要原因是wkhtmltopdf使用webkit网页渲染引擎开发的用来将 html转成 pdf…

241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

C++ High Performance(壹)

目录 前言 C概述 1.零开销原则 2.值语义 3.C函数中参数的含义 C必备技能 1.在函数返回值中使用auto 2.使用decltype(auto)转返回类型 3.对变量使用auto 4.常量引用 5.指针的常量传播 6.移动语义 7.资源获取与五法则 8.默认移动语义和零法则 9.将&&…

数据库的联合查询

数据库的联合查询 简介为什么要使⽤联合查询多表联合查询时MYSQL内部是如何进⾏计算的构造练习案例数据案例&#xff1a;⼀个完整的联合查询的过程 内连接语法⽰例 外连接语法 ⽰例⾃连接应⽤场景示例表连接练习 ⼦查询语法单⾏⼦查询多⾏⼦查询多列⼦查询在from⼦句中使⽤⼦查…

vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发

sunsetglow/vue-pdf-viewer 开箱即用的pdf插件sunsetglow/vue-pdf-viewer, vue3 版本 无需多余开发&#xff0c;操作简单&#xff0c;支持大文件 pdf 滚动加载&#xff0c;缩放&#xff0c;左侧导航&#xff0c;下载&#xff0c;页码&#xff0c;打印&#xff0c;文本复制&…

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点&#xff0c;处于次要地位主要负责处理读操作的主机称为 follower 节点…

Linux麦克风录音实战

在 Linux 上使用麦克风进行录音可以通过多种方式实现&#xff0c;包括使用命令行工具、图形界面应用程序以及编程接口。下面我将介绍几种常见的方法&#xff0c;从简单的命令行工具到使用 PortAudio 库进行编程。 一. 使用arecord命令行工具 arecord 是 ALSA&#xff08;Adva…

游戏引擎学习第23天

实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功&#xff0c;表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来&#xff0c;极大提升了开发效率。尽管目前的演示内容较为简单&#xff0c;呈现…

Oracle 数据库 IDENTITY 列

IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列&#xff0c;是由于其支持ANSI SQL 关键字 IDENTITY&#xff0c;其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的&#xff0c;毕竟MyQL已经有 AUTO_INCREMENT列&#xff0c;而SQL Server也已经有IDENT…

计算机网络socket编程(2)_UDP网络编程实现网络字典

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(2)_UDP网络编程实现网络字典 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…