系列文章目录
🎈 🎈 我的CSDN主页 :OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集 :C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集 :我的C语言进阶合集,期待你的点击!!!🌈🌈
文章目录
- 前言
- 一、指针变量和数组
- 二、二级指针
- 三、指针数组
-
- [(1) 前言:](#(1) 前言:)
- [(2) 定义语法:](#(2) 定义语法:)
- [(3) 使用注意事项:](#(3) 使用注意事项:)
- (4)例子:
- END
前言
这篇博客是指针系列 的第二篇, 将从指针变量和数组、二级指针和指针数组详细地展开介绍。
一、指针变量和数组
(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