c 语言数组

#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};


参考文章

http://www.4oa.com/Article/html/6/31/444/2005/15030_4.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值