C语言笔记第五章数组和指针的关系
第五章数组与指针的关系
如果你不太明白声明数组的语句,可以参考我前段时间贴的文章>。
数组的数组名其实可以看作是一个指针。看下面的例子:
例8:
intarray [10] = {0,1,2,3,4,5,6,7,8,9},value
...
...
value = array[0];//也可以写成:value = * array
value = array例9:
例9:
char * str [3] = {
“您好,这是样本!”,
“嗨,早上好。”,
“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,它所指向的地址是字符串“你好,这是样本!”的第一个字符的地址,也就是‘h’的地址。
str+1也是一个指针,指向数组的第一个单元格。它的类型是char**,指向
的类型是char*。
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向
“Hi,good morning”的第一个字符‘h’。”,等等。;//也可以写成:value = *(array+3);
value = array我们来总结一下数组的数组名问题。在声明数组类型array[n]时,数组
的名称array有两层含义:一是代表整个数组,其类型为TYPE[n];第二个
,是一个类型为TYPE*的指针,这个指针指向的类型是TYPE,也就是数组
单元格的类型。这个指针指向的内存区域是数组0号单元,它占用自己内部的
内存区域。注意,它不同于数组0号单元占用的内存区域。这个指针的值不能修改
,就是array++这样的表达式是错误的。
数组名array在不同的表达式中可以扮演不同的角色。
在表达式sizeof(array)中,数组名array代表数组本身,所以sizeof函数
度量的是整个数组的大小。
在表达式*array中,array作为指针,所以这个表达式的结果就是数组的unit
0的值。Zeof (* array)度量sizeof(*数组单位。
表达式array+n(其中n = 0,1,2,...),数组的作用是指针,所以arr
ay+n的结果是指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组的第
个单元。所以sizeof(array+n)度量指针类型的大小。
例10:
int array[10];
int(* ptr)[10];
ptr = & array;
在上面的例子中,ptr是一个指针,它的类型是int (*)[10],他所指向的类型是int [10]
。我们用整个数组的第一个地址初始化它。在ptr=&array语句中,array代表数组
。;//也可以写成:value = *(array+4);
在上面的例子中,一般来说,数组名array代表数组本身,类型为int [10]。但是如果把一个
rray看成一个指针,它指向数组的第0个单元,类型是int *,所指向的类型是int,这是number的组单元的类型
。所以*array等于0并不奇怪。类似地,array+3是指向数组第三个单元的
指针,因此*(array+3)等于3。其他等等。
[3]
[4]
本节提到了sizeof()函数,那么我来问一下,sizeof(指针名)测量的值
是指针自身类型的大小还是指针所指类型的大小?答案是前者。例如:
int(* ptr)[10];
在32位程序中,有:
sizeof(int(*)[10])= = 4
sizeof(int[10])= = 40
sizeof(ptr)= = 4[
0条评论