第五章。数组和指针的关系

第五章。数组和指针的关系
 
一、数组的数组名其实可以看作一个指针。看下例:
 
例1:
 
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
 
value=array[0];//也可写成:value=*array;
 
value=array[3];//也可写成:value=*(array+3);
 
value=array[4];//也可写成:value=*(array+4);
 
上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。
 
二、指针数组的定义及使用
 
例2:
 
char *str[3]={ // 注意指针数组的定义及初始化格式
 
"Hello,this is a sample!",
 
"Hi,good morning.",
 
"Hello world"
 
};
 
char s[80];
 
strcpy(s,str[0]);//也可写成strcpy(s,*str);
 
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
 
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
 
上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。
 
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。
 
三、数组名小结:
声明了一个数组TYPE array[n],则 数组名称 array 就有了两重含义:第一,它代表整个数组,它的类型是 TYPE [n] ;第二,它是一个指针,该指针的类型是 TYPE* ,该指针指向的类型是 TYPE ,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。 该指针的值是不能修改的,即类似array++的表达式是错误的。
 
在不同的表达式中数组名 array 可以扮演不同的角色。
 
(1)在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。
 
(2)在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。
 
(3)表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故 array+n 的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。
 
四、数组指针的定义及使用:
 
例3:
 
int array[10];
 
int (*ptr)[10]; // 数组指针 ptr ,指向一个数组 int[10]
 
ptr=&array;
 
上例中 ptr 是一个指针,它的类型是 int (*)[10] ,他指向的类型是 int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。
 
五、对指针和数组执行sizeof操作的结果:
sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:
 
int (*ptr)[10];
 
则在32位程序中,有:
 
sizeof(int(*)[10])==4
 
sizeof(int [10])==40
 
sizeof(ptr)==4
 
实际上, sizeof( 对象 ) 测出的都是对象自身的类型的大小,而不是别的什么类型的大小。
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值