设为首页 加入收藏

TOP

C语言中的指针与数组的关联1
2015-11-20 12:03:43 来源: 作者: 【 】 浏览:10
Tags:言中 指针 关联
?在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
? ? 未完待续
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言:设置自动关机程序:2分钟.. 下一篇[[C语言][面试题][笔试题]二维数..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: