C语言进阶教程(再论指针和数组3)

简介: C语言进阶教程(再论指针和数组3)

前言

本篇文章继续讲解指针和数组。

一、a和&a的区别

1.数组名(例如 a)表示整个数组。当使用数组名时,它会被解释为对整个数组的引用。例如,可以使用 a[0] 来访问数组的第一个元素。

2.&a 表示对数组的地址的引用,即指向整个数组的指针。使用 &a 时,它将返回指向数组的指针,类型为指向数组的指针类型(例如,int (*)[])。该指针指向数组在内存中的起始位置。

示例代码:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
    int a[5] = {1, 2, 3, 4, 5};
    printf("a : %p \n", a);
    printf("a + 1 : %p \n", a + 1);
    printf("&a + 1 : %p \n", &a + 1);
    return 0;
}

运行结果:

从运行结果来看a + 1的地址偏移量是一个元素的大小,&a + 1的偏移量则是整个数组的大小。

二、数组作为函数参数

在C语言中,当数组作为函数参数传递时,它会自动退化为指向数组首个元素的指针。这种数组到指针的转换称为数组的退化。

当数组作为函数参数传递时,实际上传递的是数组的首个元素的地址,而不是整个数组。在函数内部,该参数被解释为指向数组的指针。这意味着在函数中无法得知原始数组的长度,只能通过其他方式传递数组的长度信息。

以下是一个示例来说明数组作为函数参数时的退化现象:

#include <stdio.h>
void printArraySize(int arr[]) {
  int size = sizeof(arr) / sizeof(arr[0]);
  printf("Array size inside function: %d\n", size);
}
int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int size = sizeof(arr) / sizeof(arr[0]);
  printf("Array size in main function: %d\n", size);
  printArraySize(arr);
  return 0;
}

输出结果:

Array size in main function: 5
Array size inside function: 2

如上所示,虽然在 main 函数中计算数组 arr 的大小是正确的(5个元素),但在 printArraySize 函数中,通过 sizeof(arr) / sizeof(arr[0]) 计算得到的结果却是2。这是因为在函数参数中,arr 实际上是一个指针类型,所以 sizeof(arr) 返回的是指针大小,而不是整个数组的大小。

要注意的是,尽管在函数内部无法直接获取数组的元素个数,但可以通过其他方式将数组的长度作为额外的参数传递给函数,以便在函数内部使用。这样可以确保在函数中正确处理数组的元素个数。

总结起来,数组作为函数参数时会退化为指向数组首个元素的指针。在函数内部,无法直接获取数组的长度,需要采取其他方式传递数组的长度信息。

总结

本篇文章就讲解到这里。


相关文章
|
1天前
|
安全 C语言
【C语言】如何规避野指针
【C语言】如何规避野指针
8 0
|
1天前
|
存储 编译器 C语言
【C语言】初步解决指针疑惑
【C语言】初步解决指针疑惑
6 0
|
2天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
4天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
25 1
|
4天前
|
存储 C语言
C语言中字符串的引用与数组元素操作
C语言中字符串的引用与数组元素操作
12 0
|
4天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
12 0
|
17天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
17天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
27 0
|
20天前
|
存储 测试技术 C语言
【C语言进阶】 假期测评③
【C语言进阶】 假期测评③
41 1
|
23天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
14 0