天天看点

C语言数组与指针的区别以及使用注意事项

作者:霸都嵌入式

一、数组和指针的定义和特点

- 数组是一种数据结构,它可以存储多个相同类型的数据,它有固定的大小和连续的内存空间。数组名表示数组的首地址,也就是第一个元素的地址,它是一个常量,不能被修改。

- 指针是一种变量,它可以存储其他变量或内存地址的值,它有灵活的大小和不连续的内存空间。指针可以被赋值或修改,它可以指向任意类型的数据。

- 数组和指针都可以用来访问和操作数据,但是它们有不同的语法和语义。例如,a[i]表示数组a中第i个元素的值,而*(a+i)表示指针a加上i后所指向的内存单元的值。

二、数组和指针在使用时要注意以下几点:

- 数组名在大多数情况下会被转换为指向数组第一个元素的指针,但是在sizeof运算符和&运算符中,数组名不会被转换,而是表示整个数组的大小或地址。

- 指针在使用前必须被初始化,否则它可能会指向一个随机的内存地址,导致错误或异常。指针也要注意防止越界访问或空指针解引用。

- 数组和指针之间可以相互转换,但是要保证类型匹配和内存安全。例如,可以用一个指针来遍历一个数组,也可以用一个数组来存储多个指针。

三、数组和指针的应用示例

- 使用数组来存储一组学生的成绩,并计算平均分:

#include <stdio.h>
#define N 10 //定义数组大小为10
int main()
{
  int scores[N]; //定义一个整型数组
  int sum = 0; //定义一个求和变量
  double average; //定义一个平均分变量
  printf("Please enter %d scores:\n", N); //提示用户输入成绩
  for (int i = 0; i < N; i++) //循环读取用户输入
  {
    scanf("%d", &scores[i]); //将输入赋值给数组元素
    sum += scores[i]; //累加求和
  }
  average = (double)sum / N; //计算平均分,并转换为浮点数
  printf("The average score is %.2f\n", average); //输出平均分,保留两位小数
  return 0;
}           

- 使用指针来实现字符串拷贝函数:

#include <stdio.h>
void strcpy(char *dest, char *src) //定义拷贝函数,参数为目标字符串和源字符串的指针
{
  while (*src != '\0') //循环判断源字符串是否结束
  {
    *dest = *src; //将源字符串当前字符赋值给目标字符串
    dest++; //移动目标字符串指针到下一个位置
    src++; //移动源字符串指针到下一个位置
  }
  *dest = '\0'; //在目标字符串末尾添加结束符
}
int main()
{
  char s1[20] = "Hello"; //定义并初始化一个源字符串
  char s2[20]; //定义一个目标字符串
  strcpy(s2, s1); //调用拷贝函数
  printf("The copied string is %s\n", s2); //输出拷贝后的字符串
  return 0;
}           

- 使用数组和指针来实现二维数组的动态分配和释放:

#include <stdio.h>
#include <stdlib.h>
int **create_matrix(int rows, int cols) //定义创建矩阵的函数,参数为行数和列数,返回值为一个二维指针
{
  int **matrix; //定义一个二维指针
  matrix = (int **)malloc(rows * sizeof(int *)); //为行指针分配内存空间
  if (matrix == NULL) //判断是否分配成功
  {
    printf("Memory allocation failed\n"); //输出错误信息
    exit(1); //退出程序
  }
  for (int i = 0; i < rows; i++) //循环为每一行分配内存空间
  {
    matrix[i] = (int *)malloc(cols * sizeof(int)); //为列指针分配内存空间
    if (matrix[i] == NULL) //判断是否分配成功
    {
      printf("Memory allocation failed\n"); //输出错误信息
      exit(1); //退出程序
    }
  }
  return matrix; //返回二维指针
}
void free_matrix(int **matrix, int rows) //定义释放矩阵的函数,参数为二维指针和行数,无返回值
{
  for (int i = 0; i < rows; i++) //循环释放每一行的内存空间
  {
 	 free(matrix[i]); //释放列指针的内存空间
  }
  free(matrix); //释放行指针的内存空间
}
int main()
{
  int rows, cols; //定义行数和列数变量
  int **matrix; //定义一个二维指针
  printf("Please enter the number of rows and columns:\n"); //提示用户输入行数和列数
  scanf("%d%d", &rows, &cols); //读取用户输入
  matrix = create_matrix(rows, cols); //调用创建矩阵的函数,返回一个二维指针
  printf("Please enter the elements of the matrix:\n"); //提示用户输入矩阵元素
  for (int i = 0; i < rows; i++) //循环读取用户输入
  {
    for (int j = 0; j < cols; j++)
    {
	    scanf("%d", &matrix[i][j]); //将输入赋值给矩阵元素,可以用下标或者指针运算符来访问
    }
  }
  printf("The matrix is:\n"); //输出矩阵元素
  for (int i = 0; i < rows; i++)
  {
    for (int j = 0; j < cols; j++)
    {
    	printf("%d ", matrix[i][j]);
    }
    printf("\n");
  }
  free_matrix(matrix, rows); //调用释放矩阵的函数,避免内存泄漏
  return 0;
}           

系列文章持续更新,如果觉得有帮助请点赞+关注!

继续阅读