在C语言中,指针是一种类型,存放的是地址,例如char*p,这里p存放的是字符型数据的地址,int*p,p存放的是整形数据的地址,我们可以通过解运用*来获取该地址所指向的内容。而数组则是一种数据类型的集合,如int arr[]={1,2,3,4,5,6,7,8,9,10};这里声明与定义了一个整形数组,而char arr[]="hello world";则是声明与定义了一个字符类型的数组,这个数组内存放的是一个字符串。
C语言规定,在大多数情况下数组名其实质就是数组元素的首地址,所以我们可以通过运用指针的方式来访问数组,或者用数组下标的方式来访问指针所指向的内容,注意,这里时所指向的内容,并不是指针本身。举个例子:
int main()
{
int i = 0;
int arr[10] = { 0 };//数组的初始化
int*p = arr;//创建一个指向arr的指针
for (i = 0; i < 10; i++)//利用指针的原理对数组进行赋值
{
*(arr + i) = i;
}
for (i = 0; i < 10; i++)//利用数组下标的方式对指针所指向空间进行赋值
{
p[i] = i;
}
for (i = 0; i < 10; i++)//对结果进行验证
{
printf("arr[%d]=%d *(p+%d)=%d\n", i, arr[i], i, *(p + i));
}
system("pause");
return 0;
}
这份代码要注意两点,第一是多个指针可以指向同一块目标,第二是当数组利用指针原理进行访问时,其本身发生了降级(C和指针这本书中有讲过,解释什么是降级并不是很明确),这里我们首先要明确,指针是指针,并不是数组,创建数组,内存开辟了多个字节(取决于创建大小与所创建的数据类型),而所有指针都只有4个字节,占用一块内存空间。而所谓数组降级,就是数组名从占用多个地址,变为数组首元素的地址。只有两种运算时数组不会降级,一个事对数组进行取地址时,如&arr,还有就是调用sizeof函数时数组不会降级。再给个例子:
int main()
{
int i = 0;
int arr[10] = { 0 };//数组的初始化
int*p = arr;//创建一个指向arr的指针
printf("%d ",sizeof(arr));
printf("%d ", sizeof(p));
printf("%d ", sizeof(arr[0]));
printf("%d ", sizeof(&arr));
printf("%d ", sizeof(&arr[0]));
printf("%d ", sizeof(*&arr));
system("pause");
return 0;
}
这份代码的输出结果是什么呢,我们一个一个进行分析,首先int 类型占四个字节
第一个输出,上文提到过sizeof函数不会使数组降级,所以求的是整个数组的字节,是40
第二个输出,指针占四个字节,其输出结果为4
第三个输出,是求arr[0]的大小,为四个字节,也可以说是对arr进行了下标运算,使arr发生了降级还是4
第四个输出,取arr的地址,地址,肯定为四个字节
第五个,也是地址,四个字节
最后一个呢,取arr的地址,然后进行解运用,所得还是arr整个数组,在求其所占字节,为40
未完待续
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1714861