#include <stdio.h>
void
arry_init()
{
char c_arry_a[10] = {'a','b', 'c', 'd'};
char c_arry_b[10] = {"abcd"};
char cp_arry_c[2][10] = {"hello", "friend"};
char *cp_arry_d[10] = {NULL};
char *cp_arry_e[10];
printf("char array test:%s, %s, %s, %s\n",
c_arry_a, c_arry_b, cp_arry_c[0], cp_arry_c[1]);
printf("char array of point:%p, %p\n",
cp_arry_d[0], cp_arry_e[0]);
}
void
arry_param(char arry[])
{
printf("%s:%s\n", __func__, ++arry);
}
void
char_point_param(char *p)
{
printf("%s:%s\n", __func__, ++p);
}
void
char_const_point_param(char const * p)
{
printf("%s:%s\n", __func__, ++p);
}
void
char_point_const_param(char * const p)
{
*p = *p + 32;
printf("%s:%s\n", __func__, p);
}
void
char_const_point_const_param(char const * const p)
{
printf("%s:%s\n", __func__, p);
}
int
main(int argc, char **argv)
{
char c_arry[64] = {"Have a fun!"};
arry_init();
arry_param(c_arry);
char_point_param(c_arry);
char_const_point_param(c_arry);
char_point_const_param(c_arry);
char_const_point_const_param(c_arry);
return 0;
}
1 在把数组作为参数传递给函数时,可以通过sizeof运算符告诉函数数组的大小吗?
不可以。当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,
因为函数的数组参数相当于指向该数组第一个元素的指针。
这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种机制告诉函数数组参数的大小。
2 可以把另外一个地址赋给一个数组名吗?
不可以,尽管在一个很常见的特例中好象可以这样做。
数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。
一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。
如果一个数组是用extern或static说明的,则它的数组名是在连接时可知的一个常量,
你不能修改这样一个数组名的值,就象你不能修改7这个常量的值一样。
给数组名赋值是毫无根据的。一个指针的含义是“这里有一个元素,它的前后可能还有其它元素”,
一个数组名的含义是“这里是一个数组中的第一个元素,它的前面没有数组元素,并且只有通过数
组下标才能引用它后面的数组元素”。因此,如果需要使用指针,就应该使用指针。
有一个很常见的特例,在这个特例中,好象可以修改一个数组名的值:
void f(char a[12])
{
++a; /*legal!*/
}
秘密在于函数的数组参数并不是真正的数组,而是实实在在的指针,因此,上例和下例是等价的:
void f(char *a)
{
++a; /*certainlylegal*/
}
如果你希望上述函数中的数组名不能被修改,你可以将上述函数写成下面这样,但为此你必须使用指针句法:
void{(char *const a)
{
++a; /*illegal*/
}
在上例中,参数a是一个左值,但它前面的const关键字说明了它是不能被修改的。
3 int array_a[10],array_a和&array_a有什么不同?
前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。
4 指针数组必须初始化
char *cp_arry_d[10] = {NULL};
参考文章