零基础学指针(下)

系列文章目录

🎈 🎈 我的CSDN主页 :OTWOL的主页,欢迎!!!👋🏼👋🏼

🎉🎉我的C语言初阶合集C语言初阶合集,希望能帮到你!!!😍 😍

🔍🔍我的C语言进阶合集我的C语言进阶合集,期待你的点击!!!🌈🌈

文章目录


前言

这篇博客是指针系列 的第二篇, 将从指针变量和数组、二级指针和指针数组详细地展开介绍。


一、指针变量和数组

(1)指针变量的定义:

指针变量是一种特殊的变量,它存储的是 内存地址,而不是数据值本身。
这个内存地址 指向的是另一个变量的存储位置。
通过指针(指针变量的简称),你可以直接访问或修改该地址中存储的数据。

举个例子:
c 复制代码
int a = 5;//定义一个整型变量 a
int *p = &a;  // p 是一个整型指针变量,存储了变量 a 的地址

(2)数组的定义:

数组是一种数据结构,它包含了一系列相同类型的元素,这些元素在内存中连续存储。
数组的每个元素都有一个索引,用于访问该元素。
在C语言中,数组索引从 0开始。

举个例子:
c 复制代码
int arr[5] = {1, 2, 3, 4, 5};  // 定义一个包含 5个整数 的一维整型数组

(3)指针变量和数组的联系

(3.1)数组名的含义:

在C语言中,数组名在大多数情况下会被编译器解释为 数组首元素的地址。
也就是说,当你使用数组名时,它实际上是一个指向数组第一个元素的 指针。

举个例子:
c 复制代码
int arr[5] = {1, 2, 3, 4, 5};  // 定义一个包含 5个整数 的一维整型数组
int *p = arr;  // 这里 arr 被解释为 数组首元素的地址,赋值给了指针 p

(3.2)指针和数组的关系及示例:

通过指针遍历数组

c 复制代码
#include <stdio.h>

int main() 
{
    // 定义一个包含 5个整数 的一维整型数组
    int arr[5] = { 1, 2, 3, 4, 5 };
    // p 指向数组的第一个元素
    int* p = arr;  
    // for 遍历输出
    for (int i = 0; i < 5; i++) 
    {
        printf("%d ", *(p + i));  // 通过指针 p 遍历数组
    }
    return 0;
}
  • 结果展示(示例):

二、二级指针

(1)前言:

提到二级指针,我们先回顾一下一级指针

一级指针:

1. 定义:一级指针是一个变量,它存储的是另一个变量的内存地址。
2. 用途:一级指针常用于直接访问和操作内存中的数据,如动态内存分配、数组处理、函数参数传递等。
3. 解引用:使用一级指针时,可以通过解引用操作符(*)来访问指针所指向的数据。

  • 例子:
c 复制代码
int a = 10;
int *p = &a; // p 是一个 一级指针,指向变量 a 的地址

(2) 定义:

二级指针是一个变量,它存储的是另一个指针的内存地址,
即它 指向一个指针。

(3) 使用:

使用 二级指针时,需要 两次解引用操作 才能访问到最终的数据值。
第一次解引用得到的是 一个指针(地址),
第二次解引用才能得到 指针所指向的数据。

(4) 例子:

c 复制代码
int a = 10;
int *p = &a; // p 是一个 一级指针,指向变量 a 的地址
int **pp = &p; // pp 是一个 二级指针,指向指针 p 的地址

三、指针数组

(1) 前言:

指针数组 是一种特殊类型的 数组,其元素是指针 而不是基本数据类型或结构体等。
每个指针元素可以指向相同或不同类型的数据,
但在实际使用中,为了保持类型安全,
通常会让 指针数组中的所有元素指向相同类型的数据。

(2) 定义语法:

指针数组的定义语法与普通数组类似,
只是在数组元素类型前加上了一个星号(*),表示 该数组的元素是指针。

c 复制代码
type *arrayName[arraySize];

type:指针指向的数据类型。
*:表示这是一个指针数组。
arrayName:数组的名称。
arraySize:数组的大小,即包含多少个指针元素。

(3) 使用注意事项:

1.初始化:指针数组的元素在声明时不会自动初始化,它们的初始值是未定义的。
因此,在使用之前,通常需要手动为它们分配内存或指向有效的数据。

2. 内存管理:由于指针数组包含的是指针,因此需要特别注意内存的管理。
如果指针指向的是动态分配的内存,那么在不再需要时,应该释放这些内存以避免 内存泄漏。

3. 类型一致性:虽然C语言允许指针数组中的元素指向不同类型的数据,
但为了代码的可读性和维护性,通常建议让指针数组中的所有元素指向相同类型的数据。

4. 空指针检查:在访问指针数组中的元素之前,最好检查它们是否为空指针(NULL),以避免潜在的空指针解引用错误。

(4)例子:

c 复制代码
#include <stdio.h>

int main() 
{
    //定义并初始化字符串
    //定义了三个字符串指针 str1、str2 和 str3,
    //并将它们分别初始化为指向三个不同的字符串常量。
    char* str1 = "Hello, World!";
    char* str2 = "This is a pointer array example.";
    char* str3 = "Goodbye!";

    // 定义一个指针数组来存储字符串的地址
    char* arr[3];

    // 将字符串的地址赋值给指针数组的元素
    arr[0] = str1;
    arr[1] = str2;
    arr[2] = str3;

    // 遍历指针数组并打印每个字符串
    for (int i = 0; i < 3; i++) 
    {
        printf("%s\n", arr[i]);
    }

    // 注意:在这个例子中,我们不需要释放str1, str2, str3和 arr指向的内存,
    // 因为它们指向的是字符串常量,这些常量通常存储在程序的只读数据段中,
    // 由编译器和链接器管理。
    // 然而,如果指针数组指向的是动态分配的内存,
    // 那么在使用完毕后应该释放这些内存。

    return 0;
}
  • 结果展示:

END

每天都在学习的路上!
On The Way Of Learning

相关推荐
icesmoke24 分钟前
Codeforces Round 987 (Div. 2)(A-D)
数据结构·c++·算法
mljy.27 分钟前
C++《二叉搜索树》
c++·学习
oioihoii32 分钟前
建造者模式
c++·设计模式·c#·建造者模式
无敌岩雀1 小时前
C++设计模式行为模式———状态模式
c++·设计模式·状态模式
Peter_chq1 小时前
【计算机网络】数据链路层
linux·c语言·开发语言·网络·c++·后端·网络协议
重生之我是数学王子1 小时前
QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现
数据库·c++·qt
Darkwanderor1 小时前
迄今为止的排序算法总结
数据结构·c++·算法·排序算法
Want5952 小时前
C/C++绘制爱心
c语言·开发语言·c++
黑不溜秋的2 小时前
C++ 编程指南06 - 不要泄漏任何资源
c++