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

举报
yd_274589494 发表于 2023/11/27 22:22:45 2023/11/27
【摘要】 @TOC 前言本篇文章继续讲解指针和数组。 一、a和&a的区别1.数组名(例如 a)表示整个数组。当使用数组名时,它会被解释为对整个数组的引用。例如,可以使用 a[0] 来访问数组的第一个元素。2.&a 表示对数组的地址的引用,即指向整个数组的指针。使用 &a 时,它将返回指向数组的指针,类型为指向数组的指针类型(例如,int (*)[])。该指针指向数组在内存中的起始位置。示例代码:#in...

@TOC


前言

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

一、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) 返回的是指针大小,而不是整个数组的大小。

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

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

总结

本篇文章就讲解到这里。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。