c 数组和指针在函数参数中的转换

来源:互联网 发布:淘宝买手机卡可靠吗 编辑:程序博客网 时间:2024/05/24 08:34

相信刚接触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;
}

 

 

 

原创粉丝点击