数组名与指针

数组名:代表一个数组的首地址;
指针:指向某个变量的地址;

注意使用上的区别:
数组名相当于指针常量。指针则根据声明可以为指针变量。也就是说,指针变量的值可以改变,数组名指向地址不可能改变。
注意运行时的区别:
char *p="hello world"; char a[]="hello world"; 这两句话执行效果看上去差不多,但运行方式则有很大区别:p本身占据4字节的内存空间,它指向字符串常量hello world的首地址,这个常量在内存中存储占用了12字节,即“hello world\0”就是h的存储地址;a本身不占据空间,数组a[12]占据12字节空间(与字符串常量hello world同。
注意:计算:sizeof p = 4; sizeof a = 12*1 = 12<<0 = 12;
注意:p[4]=o, a[4]=o;但访问方式不同,p[4]访问方式:先从p的存储空间中取出存储的值,该值加4作为地址去取出存储的值为'o'; a[4]访问方式:a代表的地址加4作为新地址,取出该地址存储的值'o'。
注意:函数中把数组名作为指针传递,因此即使在实参中传入a,在函数中的sizeof a也等于4,而非数组长度乘以数组类型字节数。

等同的情况:
表达式中,函数参数中的数组名都被转化成指针。
所以对于int a[10], *p=a; p[2]和a[2]访问到的值是相同的(注意运行方式不同);
对于void func(int *p){...},调用时可以用func(a);

另外对于数组:
a[6]等价于6[a],虽然6[a]的写法比较晦涩,但合法,都表示将a作为指针加6后引用该地址内存储的值。
编译器自动把下标值乘以类型字节数以得到正确的步长。由于c变量占据空间分别为1,2,4,8,均为2的n次方,因此该乘法使用左移运算实现。
处理一维数组时,指针并不见得比数组更快。

实例:下面的程序展示了数组名作为实参传入函数的情况,请注意,函数参数只能是变量,因为实参要给它赋值!
注意:数组名作为实参传入函数,即使形参书写如同str[],但其实还是char *,形参书写str[]最好是代表形参只能传入数组首地址!!否则写char *比较好!


#include <stdio.h>

void pandstr(char str[]) {
char *p = "other hello!";

printf("str: %s, sizeof str=%d, strlen(str)=%d\n",
str, sizeof str, strlen(str));
str = p;
printf("str:%s, sizeof str=%d, strlen(str)=%d\n",
str, sizeof str, strlen(str));
}

int main(void)
{
char str[] = "Hello!";

pandstr(str);

return 0;
}



运行结果如下:
[quote]
str: Hello!, sizeof str=4, strlen(str)=6
str:other hello!, sizeof str=4, strlen(str)=12
[/quote]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值