C专家编程:第九章:再论数组

1、数组和指针相同与否的情况:

   extern,如externchar a[ ];不能改写成指针的形式

 

   声明:          定义,如 char a[10];不能改写成指针的形式

 

         函数的参数,如 func(char a[ ]);可以改成数组或指针的形式

数组:

 

 

    在表达式中使用:          如 c = a[i]; 可以改成数组或指针的形式

 

然而,数组和指针在编译器处理时是不同的,在运行时的表示形式也是不一样的,并可能产生不同的代码。对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。

2、什么时候数组和指针是相同的:

规则1:“表达式中的数组名“就是指针。

在表达式中,指针和数组是可以互换的,因为它们在编译器里的最终形式都是指针,并且都可以进行取下标操作。(a[3]等于 3[a] )

规则2:C语言把数组下标作为指针的偏移量。

不论时指针还是数组,在连续的内存地址上移动时,编译器都必须计算每次前进的步长。

规则3:“作为函数参数的数组名”等同于指针。

在函数形参定义这个特殊的情况下,编译器必须把数组形式改写成指向数组第一个元素的指针形式。编译器只向函数传递数组的地址,而不是整个数组的拷贝。下面三种形式是完全等同的:

my_function(int *turnip)       {…….}

my_function(int  turnip[])       {……..}

my_function(int turnip[200])     {……..}

3、所有属于函数实参的数组在编译时被编译器改写为指针。因此,在函数内部对数组参数的任何引用都将产生一个对指针的引用。

4、数组和指针的可交换性:

1)当把一 个数组定义为函数的参数时,可以选择把它定义为数组,也可以定义指针。不管选择哪种情况,在函数内部事实上获得的都是一个指针。

2)如果定义了一个数组,在其他文件对它进行声明时也必须把它声明为数组,指针也是如此。

5、二维数组的初始化:

1)数组里存放字符串常量:(指针数组)

char *vegetables[] = {   "carrot",

"celery",

"corn",

"cilantro"  };

2)数组里存放非字符串类型:

int row_1[ ] = {1,2,3,4,5,-1};     /*-1是行结束标志*/

int row_2[ ] = {6,7,-1};

int row_3[ ] = {8,9,10,-1};

 

int *weight[ ] = {

row_1,

row_2,

row_3

};

6、数组名:

数组作为形参传入函数中时,编译器会将数组看成指针,对数组名取址就是对指针取址,和数组名的地址不一样。但是在主函数中,对数组名取址和数组名的地址是一样的。因为数组名是不可修改的左值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值