天天看点

深入学习C语言 数组和指针

作者:嵌入式讲堂

目录

  1. 引言
  2. 数组
  3. 指针
  4. 指针常见错误用法
  5. 指针注意事项
  6. 小结

引言

数组和指针是C语言中非常重要的概念,它们可以用于存储和操作数据。本文将深入探讨C语言中的数组和指针,帮助读者更好地理解这一概念。

数组

在C语言中,数组是一种存储相同类型数据的数据结构。数组中的每个元素都有一个唯一的下标,可以通过下标访问数组中的元素。C语言中的数组可以是一维数组、二维数组等。

一维数组

一维数组是最简单的数组,它可以存储一组相同类型的数据。一维数组的定义方式如下:

类型 数组名[元素个数];           

例如,定义一个包含5个整数的数组:

int arr[5];           

可以通过下标访问数组中的元素,下标从0开始,例如:

arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;           

二维数组

二维数组是由多个一维数组组成的数组,它可以存储一个二维表格。二维数组的定义方式如下:

类型 数组名[行数][列数];           

例如,定义一个包含3行4列的整数二维数组:

int arr[3][4];           

可以通过下标访问二维数组中的元素,例如:

arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[0][3] = 4;
arr[1][0] = 5;
arr[1][1] = 6;
arr[1][2] = 7;
arr[1][3] = 8;
arr[2][0] = 9;
arr[2][1] = 10;
arr[2][2] = 11;
arr[2][3] = 12;           

指针

在C语言中,指针是一种变量,它存储了一个变量的地址。指针可以用于访问和操作变量,也可以用于动态分配内存。

指针变量

指针变量是一种变量,它存储了一个变量的地址。指针变量的定义方式如下:

类型 *指针变量名;           

例如,定义一个指向整数的指针变量:

int *ptr;           

可以使用取地址符&获取一个变量的地址,例如:

int a = 10;
int *ptr = &a;           

指针运算

指针可以进行加、减、比较等运算。指针的加、减运算是基于指针所指向的数据类型的大小进行的。

例如,指针加1表示指向下一个同类型的元素,指针减1表示指向上一个同类型的元素:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = &arr[2]; // 指向arr[2]的指针
printf("%d\n", *(ptr + 1)); // 输出arr[3]的值
printf("%d\n", *(ptr - 1)); // 输出arr[1]的值           

动态内存分配

动态内存分配是指程序在运行时申请一块内存,并在不需要时释放它。C语言中的动态内存分配由malloc()、calloc()和realloc()等函数实现。

例如,申请一块大小为10个整数的内存:

int *ptr = (int *)malloc(10 * sizeof(int));           

指针常见错误用法

指针常见的错误用法包括:

指针未初始化

指针未初始化时,它指向的地址是不确定的,使用未初始化的指针会导致程序崩溃。

int *ptr; // 未初始化的指针
*ptr = 10; // 错误的使用未初始化的指针           

指针越界

指针越界是指指针访问了不属于它的内存,这会导致程序崩溃或产生不可预测的结果。

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = &arr[5]; // 指向arr[5]的指针
*ptr = 6; // 错误的使用指针越界           

指针使用后未赋值为NULL

指针使用后未赋值为NULL,会导致它成为一个野指针,使用野指针会导致程序崩溃。

int *ptr = (int *)malloc(10 * sizeof(int));
free(ptr); // 释放内存
*ptr = 10; // 错误的使用野指针           

指针注意事项

使用指针时需要注意以下事项:

指针类型要与所指向的变量类型匹配

指针类型要与所指向的变量类型匹配,否则会导致程序崩溃或产生不可预测的结果。

int a = 10;
char *ptr = &a; // 错误的指针类型           

指针使用前要初始化

指针使用前要初始化,否则它指向的地址是不确定的,使用未初始化的指针会导致程序崩溃。

int *ptr; // 未初始化的指针           

指针使用后要赋值为NULL

指针使用后要赋值为NULL,否则它成为一个野指针,使用野指针会导致程序崩溃。

int *ptr = (int *)malloc(10 * sizeof(int));
free(ptr); // 释放内存           

小结

本文介绍了C语言中的数组和指针,希望本文能够帮助读者更好地理解这一概念。数组和指针是C语言中非常重要的概念,它们可以用于存储和操作数据,也可以用于动态内存分配等操作。包括指针的概念、用法、常见错误用法和注意事项。指针是C语言中非常重要的概念,它可以用于访问和操作变量,也可以用于动态分配内存。使用指针时需要注意指针类型、初始化和赋值为NULL等问题,避免指针错误用法导致程序崩溃

继续阅读