欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言中的指针与数组的关联1

程序员文章站 2022-08-31 19:50:31
 在C语言中,指针是一种类型,存放的是地址,例如char*p,这里p存放的是字符型数据的地址,int*p,p存放的是整形数据的地址,我们可以通过解运用*来获取该地址所指向...
 在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

    未完待续