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

引言

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

在这里插入图片描述


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语言,读者可关注博主订阅专栏持续跟进。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏,祝你平安喜乐。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值