【C语言必知必会| 第十篇】指针入门,这一篇就够了

news2024/11/18 9:28:49

引言

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】系列第十篇,介绍C语言指针,结合专题优质题目,带领读者从0开始,深度掌握知识点。

在这里插入图片描述

✈️文章目录

    • 1️⃣ 概念介绍
    • 2️⃣代码过渡
      • 指针类型
      • 指针运算
    • 3️⃣注意事项
    • 4️⃣编程实例
    • 5️⃣总结


1️⃣ 概念介绍

指针是C语言中一种非常重要的概念。顾名思义,它是用于指向某个对象或数据的。 它是一个变量,存储了内存地址,可以用来表示变量、数组元素、函数等在内存中的位置,使程序能够直接访问和操作这些数据。


2️⃣代码过渡

在正式开始指针的代码实现之前,我们需要掌握一些概念和语法。

指针类型

在C语言中,指针的类型与指针所指向的数据类型相关联。指针的类型告诉编译器如何解释指针所指向的内存地址上存储的数据。

以下是几种常见的指针类型:

类型定义
整型指针int *ptr;
浮点型指针float *ptr;
字符型指针char *ptr;
结构体指针struct Person *ptr;
数组指针int *ptr = arr;arr为整型数组)
函数指针void (*ptr)(int);

指针类型可以与 const 关键字一起使用,以表示指针所指向的数据是常量。例如:

const int *ptr;    // ptr 是一个指向常量整数的指针
int *const ptr;    // ptr 是一个指向整数的常量指针
const int *const ptr;  // ptr 是一个指向常量整数的常量指针

在这里插入图片描述

指针运算

指针运算是对指针进行的一系列操作。它可以帮助我们更加高效地访问和操作内存中的数据。

以下是几种常见的指针运算:

谨记:在使用指针之前,要对指针进行声明,可以通过在变量名前面加上 * 符号来声明一个指针变量。 例如:

int *ptr;    // 声明一个指向整数类型的指针变量
float *fptr; // 声明一个指向浮点数类型的指针变量
char *cptr;  // 声明一个指向字符类型的指针变量

1.地址运算符(&):
取地址运算符用于获取变量或数组元素的内存地址。例如:

int num = 10;        // 声明一个整型变量 num
int *ptr = #     // 使用取地址运算符获取 num 的地址,并将该地址赋值给指针 ptr

2.解引用运算符(*):
解引用运算符用于获取指针所指向的内存地址上存储的值。例如:

int num = 10;         // 声明一个整型变量 num
int *ptr = #      // 使用取地址运算符获取 num 的地址,并将该地址赋值给指针 ptr
printf("%d\n", *ptr); // 输出指针 ptr 所指向的地址上存储的值

在这里插入图片描述

3.指针加法:
指针加法可以用于将指针指向的内存地址加上一个常数或变量的偏移量。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;           // 将指针指向数组的第一个元素
ptr++;                    // 将指针加一,指向数组的第二个元素
printf("%d\n", *ptr);     // 输出指针所指向的地址上存储的值

在这里插入图片描述

4.指针减法:
指针减法可以用于将指针指向的内存地址减去一个常数或变量的偏移量。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = &arr[4];       // 将指针指向数组的最后一个元素
ptr--;                    // 将指针减一,指向数组的倒数第二个元素
printf("%d\n", *ptr);     // 输出指针所指向的地址上存储的值

在这里插入图片描述

5.指针与整数的比较:
指针可以与整数进行比较,比较的结果是指针所指向的内存地址与整数之间的大小关系。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;           // 将指针指向数组的第一个元素
if (ptr == &arr[0]) {     // 比较指针和数组元素的地址是否相等
    printf("The pointer points to the first element of the array.\n");
}

在这里插入图片描述

6.指针与指针的比较:
指针也可以与其他指针进行比较,比较的结果是这两个指针所指向的内存地址之间的大小关系。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr1 = arr;           // 将指针1指向数组的第一个元素
int *ptr2 = &arr[3];       // 将指针2指向数组的第四个元素
if (ptr1 < ptr2) {         // 比较指针1和指针2所指向的地址之间的大小关系
    printf("The first element of the array is located before the fourth element in memory.\n");
}

在这里插入图片描述


3️⃣注意事项

使用指针时需要特别注意以下几点:

1.指针需要初始化:
在使用指针之前必须将其初始化,否则它将指向一个未知的内存地址,这可能会导致程序出现不可预知的错误。

在这里插入图片描述

2.指针需要遵循数据类型:
指针的类型必须与它所指向的数据类型匹配,否则指针所指向的数据可能被错误地读取或写入。

在这里插入图片描述

3.避免使用空指针:
在使用指针之前应该对指针进行空值检查,以确保它不是一个空指针。引用空指针会导致程序崩溃。

在这里插入图片描述

4.避免指针越界:
指针越界可能会导致程序崩溃或产生不可预知的结果。

在这里插入图片描述


4️⃣编程实例

指针的形式语法、知识点、注意事项我们已讲解完毕。

接着我们通过编程实例,进行实战讲解。

题目要求:

判断一个给定的字符串是否是回文字符串。回文字符串是指正着读和反着读都一样的字符串。

要求:

  • 如果输入字符串是回文字符串,则返回 1;如果不是回文字符串,则返回 0。

示例:

输入:eve
输出:1

输入:hello
输出:0

1.解题思路

1.初始化两个指针,一个指向字符串的开头,一个指向字符串的末尾。
2.依次比较两个指针指向的字符是否相等,如果相等,则将两个指针向中间移动一位;如果不相等,则返回0。
3.重复步骤2,直到两个指针相遇或交叉。
4.如果两个指针相遇或交叉时都没有返回0,则说明该字符串是回文字符串,返回1。

2.代码实现

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

// 判断是否为回文字符串,接收一个字符指针作为参数
int is_palindrome(char *s) {
    int len = strlen(s);  // 获取字符串的长度
    char *start = s;  // 指向字符串头部的指针
    char *end = s + len - 1;  // 指向字符串尾部的指针
    
    // 从两端向中间遍历字符串
    while (start < end) {
        if (*start != *end) {  // 比较当前位置的字符是否相同
            return 0;  // 如果不相同,直接返回0,表示不是回文字符串
        }
        start++;  // 指针向后移动
        end--;  // 指针向前移动
    }
    
    return 1;  // 如果没有出现不相同的字符,表示是回文字符串,返回1
}

int main() {
    char str[100];
    printf("请输入一个字符串:");
    scanf("%s", str);
    
    int result = is_palindrome(str);  // 调用函数判断字符串是否为回文字符串
    
    if (result) {
        printf("是回文字符串\n");
    } else {
        printf("不是回文字符串\n");
    }
    
    return 0;
}

编译运行结果:

在这里插入图片描述

至此,指针的编程实例已讲解完成,读者需要躬身实践来掌握C语言指针相关知识点。


5️⃣总结

此文为 【C语言必知必会】系列第十篇指针入门 ,带领读者从0开始,深刻掌握C语言的指针。

以题代练对于C语言的学习是十分重要的,所以专栏将提供优质C语言编程题,带领读者全方位掌握C语言,读者可关注博主订阅专栏持续跟进。

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

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

相关文章

(N-128)基于springboot,vue酒店管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis 本系统功…

推荐《机动战士高达SEED DESTINY》

《机动战士高达SEED DESTINY》是《机动战士高达SEED》的续集&#xff0c;于日本时间2004年10月9日—2005年10月1日每周六下午六点在每日放送、TBS电视台系列电视台播出&#xff0c;全50话。 [1] 台湾版权由博英社取得&#xff0c;并于2005年10月8日起由中国电视公司在每周六播…

光伏三相并网逆变器的控制策略与性能分析(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【c语言】atoi的模拟实现

1.头文件 atoi() 是 C语言的一个标准库函数&#xff0c;定义在<stdlib.h>头文件中 2.atoi的解析 具体来讲&#xff0c;atoi() 函数首先会丢弃尽可能多的空白字符&#xff0c;直至找到第一个非空白字符&#xff0c;然后从该字符开始&#xff0c;识别 “”、“-” 以及 …

Python---循环---while循环

Python中的循环 包括 while循环与for循环&#xff0c;本文以while循环为主。 Python中所有的知识点&#xff0c;都是为了解决某个问题诞生的&#xff0c;就好比中文的汉字&#xff0c;每个汉字都是为了解决某种意思表达而诞生的。 1、什么是循环 现实生活中&#xff0c;也有…

华硕ROG吹雪和微星刀锋钛两者如何选择

## 华硕Rog系列主板里面的吹雪和微星主板里面的刀锋钛两者相比分别有什么特点&#xff0c;二选一应该选择哪个&#xff1f; 首先&#xff0c;要明确"吹雪"和"刀锋钛"并不是主板本身的名称&#xff0c;而是主板系列或某种设计风格的称呼。华硕和微星都是非常…

隐式类型转换

什么是隐式类型转换&#xff0c;多参数的造函数隐式类型转换&#xff0c;和单参数的构造函数隐式类型转换有什么区别 C中有三种主要的隐式类型转换&#xff1a; 1:多参数的构造函数隐式类型转换 2:单参数的构造函数隐式类型转换 3:成员函数隐式类型转换。…

【KingHistorian】新授权配置与使用说明

哈喽&#xff0c;大家好&#xff0c;我是雷工。 今天在现场安装KingHistorian的授权时&#xff0c;一时想不起来上次咋安装的了&#xff0c;真是好记性不如烂笔头&#xff0c;更何况记性还不咋地&#xff0c;又琢磨了半小时才想起来&#xff0c;现将授权配置与使用说明整理如下…

idea leetcode配置

idea leetcode配置 配置页面如下图所示&#xff0c;根据需要&#xff0c;填入登录用户名、密码、文件存放路径&#xff0c;注意如果要使用自定义的代码结构配置&#xff0c;要勾选图中框出来的选项。 Code FileName&#xff1a; $!velocityTool.camelCaseName(${question.tit…

零基础新手也能会的H5邀请函制作教程

随着科技的的发展&#xff0c;H5邀请函已经成为了各种活动、婚礼、会议等场合的常见邀约方式。它们不仅可以提供动态、互动的体验&#xff0c;还能让邀请内容更加丰富多彩。下面&#xff0c;我们将通过乔拓云平台&#xff0c;带领大家一步步完成H5邀请函的制作。 1. 选择可靠的…

H3C交换机 万兆光模块可以插在千兆光口上使用吗?

环境&#xff1a; S6520X-24ST-SI交换机 H3C LSWM1QSTK2万兆40G堆叠线QSFP 问题描述&#xff1a; H3C交换机 万兆光模块可以插在千兆光口上使用吗&#xff1f; 答案&#xff1a; H3C交换机的万兆光模块&#xff08;10 Gigabit Ethernet Module&#xff09;通常使用的是SFP…

基于主动移频法与AFD孤岛检测的单相并网逆变器仿真(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

光储并网直流微电网simulink仿真模型,光伏采用mppt实现最大功率输出研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

来看看 Discourse 3.2.0.beta2 版本添加的新功能

3.2.0.beta2 版本是在 2023-10-16 发布的&#xff0c;根据官方的说法&#xff0c;主要添加了 3 个新功能。 官方的发布日志页面&#xff1a;3.2.0.beta2: Auto delete unused tags, custom date range for reports, new chat notifications, and more - announcements - Disco…

专题:链表常考题目汇总

文章目录 反转类型&#xff1a;206.反转链表完整版二刷记录 25. K个一组反转链表1 &#xff1a;子链表左闭右闭反转版本2 &#xff1a; 子链表左闭右开反转版本&#xff08;推荐&#xff09;⭐反转链表左闭右闭和左闭右开 合并类型&#xff1a;21.合并两个有序链表1: 递归法2: …

解决方法:从客户端(---<A href=“http://l...“)中检测到有潜在危险的 Request.Form 值。

从客户端(-----<A href"http://l...")中检测到有潜在危险的 Request.Form 值。 解决方法&#xff1a;应该是不同的.net Framework版本对代码的校验不同&#xff0c;造成在高版本操作系统&#xff08;即高.net Framework版本校验&#xff09;不兼容&#xff0c;可…

YOLO目标检测——红白细胞血小板数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红白细胞血小板计数和分类数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签&…

【试题032】C语言关系运算符例题

1.题目&#xff1a;设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为&#xff1f; 2.代码分析&#xff1a; //设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为?int a 2, b 4, c 5;printf("%d\n", (a b ! c > b > a));//分析&#xff…

Python合并同类别且相交的矩形框

Python合并同类别且相交的矩形框 前言前提条件相关介绍实验环境Python合并同类别且相交的矩形框代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或…

攻防世界web篇-disabled_button

一个不能按的按钮&#xff0c;试过点击&#xff0c;确实是点不了&#xff0c;所以只能查看源代码喽 经过仔细查看&#xff0c;发现这里多了disabled&#xff0c;这个参数在linux中是禁止的意思&#xff0c;大概是这个意思吧&#xff0c;毕竟开机不自启就用这个参数 在控制台这…