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

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

目录
相关文章
|
1月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
59 2
|
1月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
49 0
|
30天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
17 2
|
1月前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
1月前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
1月前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
C语言
C语言指针(3)
C语言指针(3)
14 1
|
1月前
|
C语言
C语言指针(2)
C语言指针(2)
15 1
下一篇
无影云桌面