C语言中的指针与数组的关联1
程序员文章站
2022-04-22 09:16:14
在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
未完待续