前言
本篇文章继续讲解指针和数组。
一、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) 返回的是指针大小,而不是整个数组的大小。
要注意的是,尽管在函数内部无法直接获取数组的元素个数,但可以通过其他方式将数组的长度作为额外的参数传递给函数,以便在函数内部使用。这样可以确保在函数中正确处理数组的元素个数。
总结起来,数组作为函数参数时会退化为指向数组首个元素的指针。在函数内部,无法直接获取数组的长度,需要采取其他方式传递数组的长度信息。
总结
本篇文章就讲解到这里。