辨析--数组,指针

多数的数组引用都会退化为数组第一元素的指针,就是C语言中数组和指针“等价”的基础。

在C语言中只是指针算术和数组下标运算等价,指针和数组是不同的。

因此,数组在C语言中是个“二等公民”。

事实上,下表表达式 a[i] 就是按照等价的指针表达式 *((a)+(i)) 定义的。


1,函数形参的数组和指针声明可以互换。

例如:void f(char a[]) {} 与 void f(char *a) {}

这是一种便利的做法,由于数组会马上退化为指针,数组事实上从来没有被传入函数。

允许指针参数声明为数组只不过是为了让它看起来好像传入了数组。

2,数组不能被赋值。

例如:char carr [10];

carr = "abc"; //error

3,数组和下标在C语言中可以互换。

在C语言中的字符串就是char型数组,所以表达式“abc”[2]是合法的,值就是字符‘c’。

int main(int argc, char* agrv[])
{
    char c = "abc"[2];
    printf("\"abc\"[2]=%c\n", c);
    return 0;
}

(环境win7 32位 vc6.0)输出:"abc"[2]=c

4,数组和指针

(1)数组和指针的区别

          区别在于类型

          在标准C中,&array生成一个“T型数组”的指针,指向整个数组

          在所有的C编译器中,对数组的简单引用(不包括&操作符)生成一个"T型"的指针,指向数组的第一个元素

          例如: int a[10];

          对于a的引用的类型是“int型的指针”,而&a是“10个int的数组的指针”。   

 (2) int (*ap)[3],ap为数组指针,在使用下标或增量操作符的时候,会跳过整个数组。

5,数组的大小

sizeof操作符如果能够判断出数组的大小,它就会返回数组的大小。如果数组的大小未知或者数组已经退化为指针,

则它不能提供数组的大小。

例如:

void f(char arr[])
{
    printf("f() arr sizeof:%d\n", sizeof(arr));
}

int main(int argc, char* agrv[])
{
    char arr[20];
    printf("sizeof(arr):%d\n", sizeof(arr));// 输出20

    f(arr); //输出4,arr退化为指针
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值