相信刚接触c的人会认为,指针和数组是互换,但是很明显不是这样子的。之前曾经详细的罗列了数组和指针的区别。这里就不再详述了。
以下是一段示例程序,将帮助你理解数组在传递到函数参数中时发生的变化:
#include "stdio.h"
char g_a[] = "abcdefghi";
//session 1:参数使用数组
//由于编译器都会将形参中的数组转换成指针,所以打印出的地址是形参指针的地址
//其实也就是一个局部变量
void my_array_func(char ca[]){
printf(" addr of array param = %p /n", &ca);
printf(" addr (ca[0]) = %p /n", &(ca[0]));
printf(" addr (ca[1]) = %p /n", &(ca[1]));
printf(" ++ca = %p /n/n", ++ca);
return ;
}
//session 2:参数使用指针
//所以打印出的地址就是局部变量指针的地址
//指针所指向的正是实参数组的第一个元素
void my_point_func(char *p_a){
printf(" addr of ptr param = %p /n", &p_a);
printf(" addr (p_a[0]) = %p /n", &(p_a[0]));
printf(" addr (p_a[1]) = %p /n", &(p_a[1]));
printf(" ++p_a = %p /n/n", ++p_a);
return ;
}
int main(int argc, char* argv[])
{
//直接打印出数组的地址
//因为没有经过函数调用,所以不会被转换成指针
//所以打印出的是数组本身的地址
printf("Hello World!/n");
printf(" addr of global array = %p /n", &g_a);
printf(" addr (g_a[0]) = %p /n", &(g_a[0]));
printf(" addr (g_a[1]) = %p /n/n", &(g_a[1]));
my_array_func(g_a);
my_point_func(g_a);
//conclusion :函数中形参无论是定义为数组还是指针,最终都会转化成指针
//且指针所指向的正是实参数组的第一个元素
//而在未经过函数调用的,并不会出现这种编译器的转换
//这也是为什么无法在函数内部调用sizeof计算出数组长度的原因
//当然,我们很庆幸发现了这点。
return 0;
}