上一篇:函数和递归
下一篇:字符串和字符处理
❤️🔥前情提要❤️🔥
欢迎来到C语言基本语法教程
在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断学习并详细讲解C语言的基本语法
及其高级用法
。
上一节讲了C语言基础中的函数和递归,接下来让我们来一起学习C语言中的数组和指针
。
🍪本教程内容干货满满,跟上步伐吧~🍪
作者介绍:
🎓 作者:某不知名编程爱好者📜
🗒️系列文章&专栏推荐: 🔗《华为机试题解析》 、🔗《C语言程序设计》、🔗 《MySQL数据库》
🕸️为大家推荐一款很好用的C语言刷题网站🔗点击跳转
🔖导航小助手🔖
- 📑 数组和指针
- 📑 1. 数组
- 🏷️ 1.1 数组的定义
- 🏷️ 1.2 数组的使用方法
- 🏷️ 1.3 数组的初始化
- 🏷️ 1.4 数组的遍历
- 🏷️ 1.5 数组的常见问题
- 📑 2. 指针
- 🏷️ 2.1 指针的定义
- 🏷️ 2.2 指针的使用方法
- 🏷️ 2.3 指针的运算
- 🏷️ 2.4 指针的关系操作
- 🏷️ 2.5 指针地址的转换
- 🏷️ 2.6 指针的应用场景
- 📑 3. 数组指针
- 🏷️ 3.1 数组指针的定义
- 🏷️ 3.2 数组指针和指针数组
- 🏷️ 3.3 数组指针的应用场景
- 📑 4. 多维数组
- 🏷️ 4.1 二维数组的定义
- 🏷️ 4.2 二维数组的使用方法
- 🏷️ 4.3 二维数组的初始化
- 🏷️ 4.4 多维数组的定义和使用
- 📑 5. 数组和指针在函数中的应用
- 🏷️ 5.1 数组作为函数的参数
- 🏷️ 5.2 指针作为函数的参数
- 🏷️ 5.3 数组指针作为函数的参数
- 🏷️ 5.4 函数返回指针
- 📑 6. 数组和指针的高级应用
- 🏷️ 6.1 动态内存分配
- 🏷️ 6.2 指向函数的指针
- 🏷️ 6.3 结构体和指针数组的结合使用
- 🏷️ 6.4 指令和指针的安全使用
- ⚠️ 注意事项
- 🎀小结
📑 数组和指针
- C语言中
数组
和指针
的使用是任何一个程序员必须掌握的基础知识。数组作为一种常用的数据结构,可以用于存储一系列同一类型的数据
。指针
则是C语言中的重要概念之一,它指向一个内存地址
,可以用于数据的传递和操作
。
📑 1. 数组
🏷️ 1.1 数组的定义
- 在C语言中,
数组
可以定义为一组相同类型
的数据元素的集合
。数组中的每个元素
都可以通过一个下标
访问,下标从0
开始计数。数组的定义方式如下:
数据类型 数组名[数组长度];
例如,定义一个长度为10的int类型数组:
int arr[10];
🏷️ 1.2 数组的使用方法
数组的元素可以通过下标来访问
,例如:
arr[0] = 1;
上述语句将数组arr的第一个元素赋值为1。数组的元素也可以通过循环来遍历
:
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
上述语句将数组arr的元素依次赋值为0~9
。
🏷️ 1.3 数组的初始化
在定义数组时,可以直接初始化数组元素的值
:
int arr[5] = {1, 2, 3, 4, 5};
上述语句定义了一个长度为5的int类型数组,并将其元素依次初始化为1~5。
🏷️ 1.4 数组的遍历
数组的遍历
可以使用for循环
来实现:
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
上述语句将数组arr的所有元素按顺序输出。
🏷️ 1.5 数组的常见问题
数组的下标越界
是C语言中常见的问题,使用数组时一定要确保下标不超出数组的范围
。另外,数组在作为函数参数
传递时会自动转换为指针
,这也是需要注意的地方。
📑 2. 指针
🏷️ 2.1 指针的定义
指针是一个存储变量地址
的变量。指针的定义方式如下:
数据类型 *指针变量名;
例如,定义一个int
类型的指针变量:
int *ptr;
🏷️ 2.2 指针的使用方法
指针可以用于访问
和修改变量
的值,例如:
int a = 10;
int *ptr = &a;
*ptr = 20;
上述语句将变量a的值修改为20。指针也可以通过循环来遍历数组
:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
for (int i = 0; i < 5; i++) {
printf("%d ", *(ptr+i));
}
上述语句将数组arr的所有元素按顺序输出。
🏷️ 2.3 指针的运算
指针也可以进行加减运算
,例如:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("%d\n", *(ptr+3)); //输出4
指针也可以自增
或自减
,例如:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
ptr++; //指向arr[1]
🏷️ 2.4 指针的关系操作
指针也可以进行关系运算
,例如:
int a = 10;
int b = 20;
int *pa = &a;
int *pb = &b;
if (pa < pb) {
printf("pa < pb\n");
}
else {
printf("pa >= pb\n");
}
上述语句将输出"pa < pb
",因为指针pa指向的变量a在内存中的地址小于指针pb指向的变量b在内存中的地址。(运行结果可能会不同)
🏷️ 2.5 指针地址的转换
指针地址可以通过强制类型转换
变为不同数据类型的指针
,例如:
int a = 10;
float *ptr = (float *)&a;
*ptr = 10.5;
printf("%.2f\n", (float)a);
上述语句将输出"10.50",因为将整型变量a的地址强制转换为float型指针后,可以将其看作一个浮点数变量。(运行结果可能会不同)
🏷️ 2.6 指针的应用场景
指针可以用于数据结构
和动态内存分配
等场景中,例如链表
、树
和堆
等数据结构;以及malloc()
和free()
函数进行动态内存分配
等。
📑 3. 数组指针
🏷️ 3.1 数组指针的定义
数组指针
是指向数组的指针
。数组指针的定义方式如下:
数据类型 (*数组指针变量名)[数组长度];
例如,定义一个指向int类型数组的指针:
int arr[5];
int (*ptr)[5] = &arr;
🏷️ 3.2 数组指针和指针数组
数组指针
与指针数组
是两个不同的概念。指针数组是一个数组
,其中每个元素
都是一个指针
。而数组指针
是一个指向数组的指针
。
例如,定义一个指针数组和一个数组指针:
int a = 1, b = 2, c = 3;
int *arr[] = {&a, &b, &c}; //指针数组
int arr1[3] = {1, 2, 3};
int (*ptr)[3] = &arr1; //数组指针
🏷️ 3.3 数组指针的应用场景
数组指针可以用于多维数组
的访问
和传递
,例如:
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*ptr)[3] = arr;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", *(*(ptr+i)+j));
}
printf("\n");
}
上述语句将多维数组arr的所有元素按顺序输出。
📑 4. 多维数组
🏷️ 4.1 二维数组的定义
在C语言中,可以定义多维数组
。二维数组是最常见的多维数组。定义一个二维数组的方式如下:
数据类型 数组名[行数][列数];
例如,定义一个3行4列的int类型二维数组:
int arr[3][4];
🏷️ 4.2 二维数组的使用方法
二维数组的元素可以通过索引访问
,例如:
int arr[3][4];
arr[0][1] = 1;
上述语句将二维数组arr的第一行第二列的元素赋值为1。
🏷️ 4.3 二维数组的初始化
在定义二维数组时,可以直接初始化数组元素的值
:
int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
上述语句定义了一个3行4列的int类型二维数组,并将其元素依次初始化为1~12。
🏷️ 4.4 多维数组的定义和使用
类似地,C语言中还可以定义三维及以上的多维数组
,例如:
int arr[2][3][4];
arr[0][1][2] = 1;
上述语句定义了一个2x3x4的int类型的三维数组,并将其第一块的第二行第三列的元素赋值为1。
📑 5. 数组和指针在函数中的应用
🏷️ 5.1 数组作为函数的参数
在函数中,数组
可以作为参数传递
。定义一个接受数组作为参数的函数的方式如下:
void func(int arr[], int len);
其中,arr是一个int类型的数组,len是数组的长度。
🏷️ 5.2 指针作为函数的参数
指针
也可以作为参数传递
:
void func(int *ptr, int len);
其中,ptr是一个int类型的指针,len是数组的长度。
🏷️ 5.3 数组指针作为函数的参数
数组指针
也可以作为参数传递
:
void func(int (*ptr)[5], int len);
其中,ptr是一个指向int类型数组的指针,len是数组的长度。
🏷️ 5.4 函数返回指针
函数
也可以返回指针
,例如:
int *func();
上述函数定义了一个返回int类型指针的函数。
📑 6. 数组和指针的高级应用
🏷️ 6.1 动态内存分配
动态内存分配
可以通过malloc()
函数实现:
int *ptr = malloc(10 * sizeof(int));
上述语句定义了一个长度为10的int类型的动态数组。
🏷️ 6.2 指向函数的指针
指向函数的指针
可以通过以下方式定义:
int (*func)();
上述语句定义了一个指向返回int类型的函数的指针。
🏷️ 6.3 结构体和指针数组的结合使用
结构体
和指针数组
可以结合使用来表示复杂的数据结构,并通过指针来进行操作,例如:
struct student {
char name[20];
int age;
};
struct student stu_arr[3] = {{"Tom", 18}, {"Jack", 19}, {"Lucy", 20}};
struct student *ptr_arr[3];
for (int i = 0; i < 3; i++) {
ptr_arr[i] = &stu_arr[i];
}
for (int i = 0; i < 3; i++) {
printf("%s %d\n", ptr_arr[i]->name, ptr_arr[i]->age);
}
上述语句定义了一个结构体数组,然后将每个元素的地址保存到一个指针数组中,并对每个结构体进行操作。
🏷️ 6.4 指令和指针的安全使用
为了防止指针访问非法内存地址
,通过检查指针的值
或使用NULL
来进行指针的安全使用,例如:
int *ptr = NULL;
if (ptr != NULL) {
*ptr = 1;
}
上述语句判断指针ptr是否为NULL,如果不是,则进行赋值操作。
⚠️ 注意事项
-
使用数组时,一定要确保
下标不超出数组的范围
,否则会出现程序崩溃、数据错误等问题。 -
使用指针时,一定要确保指针不是
空指针
,否则会出现程序崩溃的问题,可以使用空指针常量NULL进行判断。 -
定义指针变量时,一定要对其进行
初始化
,否则可能指向非法地址
,导致程序崩溃。 -
指针使用完成后,应该
及时将其置空
,避免误用导致程序出现问题。 -
数组在作为函数参数传递时会
自动转换为指针
,此时需要注意指针和数组的区别。 -
使用
malloc()
等动态内存分配函数时,一定要释放已分配的内存
,避免内存泄漏。 -
指针类型转换时需要注意
数据类型的匹配
,否则会出现数据错误。 -
处理多级指针时,需要注意指针的级别,如
二级指针
需要使用二级指针变量
来存储和传递指针的地址。
对于数组
和指针
的使用,需要掌握基本的概念和语法,同时需要注意数据类型的匹配
和数据访问的安全性
,避免程序出现错误和安全问题。
上一篇:函数和递归
下一篇:字符串和字符处理
🎀小结
本文介绍了C语言中数组和指针
的基本概念和用法,并讲解了数组指针
和多维数组
的使用。同时,本文还介绍了数组和指针在函数中的应用
,以及动态内存分配
、指向函数的指针
、结构体
和指针数组
的结合使用等高级应用。通过本文的学习,读者可以更好地掌握C语言中数组和指针的使用,为后续的程序开发打下基础。
🔚以上就是C语言数组和指针
的全部知识了~
🤗感谢大家的阅读~
📬后续还会继续更新💓,欢迎持续关注哟~📌
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨