数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。定义数组时,一定要给出数组名,数组名可以认为是一个指针,它指向数组的第 0 个元素。在C语言中,我们将第 0 个元素的地址称为数组的首地址。虽然可以认为是一个指针,但你在定义时千万别再数组变量名前面加 * ,否者这就不是一个常规的数组了,而是指针数组,里面的所有元素都是指针。
#include<stdio.h>
void main(){
int arr[] = {1,2,3,4,5,6};
这里的变量名arr里面存放的有该数组的第一个数据的地址也就是arr[0]的地址值
所以可以认为arr就是该数组的指针
int *p=arr;
int *arr[]={p};
}
常规遍历数组和指针遍历数组:
#include<stdio.h>
void main(){
int arr[]={6,4,3,5,8,1};
int len = sizeof(arr);
for(int i=0;i<len;i++){
printf("%d\n",arr[i]);常规遍历方式
}
for(int i=0;i<len;i++){
printf("%d\n",*(arr+i));使用arr指针遍历方式
}
int *p_arr=arr;
for(int i=0;i<len;i++){
printf("%d\n",*(p_arr+i));额外使用新指针来遍历数组
printf("%d\n",*p_arr++);额外使用新指针来遍历数组
}
}
当然,你还可以通过指针来直接修改数组的元素的值。但是你不可能通过像指针修改基本类型的变量的数据内容那样去修改数组变量arr的地址值。
#include<stdio.h>
void main(){
int a = 10;
int *p = &a;
a = *p+1;
printf("%d\n",a);结果是11,变量a中的数据已经被改变了
int arr[1]={2};
int *p_arr = arr;
arr = *p_arr+1;这种操作是不允许的,因为arr指向的是一个数组而不是一个基本数据类型
}