通过指针引用数组
每个变量都有地址,数组包含多个数组元素 每个数组元素都是变量,在内存中占用存储单元,指针变量也可以存放数组元素的地址,这就是数组元素的指针
数组元素的访问可以通过下标直接访问,也可以通过 指针间接访问(占内存少,运行速度快)
指针加一
指针可以进行 p+1 p-1 p++ ++p p-- --p
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素
在这里,并不是对p的值进行简单的加1,而是加上一个数组元素所占用的字节数,在定义指针变量时要指定基类型,执行p++时,系统就根据p的基类型确定其字节数。
数组名是数组首元素的地址,他就相当于一个指向数组首元素的指针,所以这里给数组名加1或减1等价于指针变量的加1或减1
如果p的初值为&a[0],则p+i和a+i都是数组元素a[i]的地址
两个地址相加没有意义
指向同一个数组的两个指针变量相减的结果是两个地址之差除以数组元素的长度(也是他们之间相差的数组元素个数)
int main()
{
int arr[10] = { 12,23,34,45,56,67,78,89,90,100 };
int *p = arr;
printf("%d %d %d %d %d %d \n", p, &arr, arr, &arr[0], *p, arr[0]);
printf("%d %d %d %d %d %d\n", p + 1, &arr[1], arr + 1, *(p + 1), *(arr + 1), arr[1]);
p++;
printf("%d\n", *p); //对p自增之后解引用,得到的是arr[1]的值
*p++;
printf("%d\n ", *p); //++和*同优先级,结合方向为从右至左
*++p;
printf(" %d %d\n",p, *p);
++*p;
printf("%d %d\n", p, *p);//对p解引用得到的值进行自增,地址不变,p值不变
}
数组名做函数参数
用数组元素做函数实参时,与用变量做函数实参一样,是“值传递”方式,将实参的值单向传递给型参
当形参的值改变时,实参的值并没有变化
用数组名做函数参数时,由于数组名表示的是数组首元素的地址,因此传递的值是地址,所以要求型参为指针变量
实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是 一个固定的地址,而是按指针变量处理
由于形参数组名接收了实参数组首元素的地址,可以认为在函数调用期间,行参数组与实参数组共用一段内存单元
编写程序将数组中的元素逆序排列
int main()
{
void inv(int ar[], int n);
int arr[9] = { 12,23,34,13,15,17,35,46,57 };
for (int i = 0; i < 9; i++)
{
printf("%d", arr[i]);
printf("\t");
}
printf("\n");
inv(arr, 9);
for (int i = 0; i < 9; i++)
{
printf("%d", arr[i]);
printf("\t");
}
printf("\n");
return 0;
}
void inv(int ar[], int n)
{
int temp;
int m = n / 2;
for (int i = 0; i < m; i++)
{
int j = n - 1 - i;
temp = ar[i];
ar[i] = ar[j];
ar[j] = temp;
}
return;
}
对数组元素进行排序```
int main()
{
void sort(int arr[], int n);
int ar[10];
int *p;
p = ar;
for (int i = 0; i < 10; i++)
{
scanf("%d", p++);
}
p = ar;
sort(p, 10);
int i;
for (p=ar,i = 0; i < 10; i++)
{
printf("%d\t", *p);
p++;
}
printf("\n");
return 0;
}
void sort(int arr[], int n)
{
int temp=0;
for (int i = 0; i < n - 1; i++)
{
for (int j = i+1; j < n; j++)
{
if (arr[j] > arr[i])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return;
}